2010-03-25 5 views
6

Java에서 File.createTempFile()을 사용하여 지정된 위치에 실행 파일을 추출합니다. 실행 파일을 실행하려고하면 출력의 첫 번째 행을 읽으려고 할 때 프로그램이 중단됩니다.Java에서 Windows 파일 이름의 문제를 어떻게 해결합니까?

다른 프로그램에서 추출한 실행 파일을 실행하려고하면 C : \ Documents and Settings \ username \ Local Settings \ Temp \ prog.exe와 같은 디렉터리를 지정하면 작동한다는 것을 발견했습니다. 하지만 C : \ DOCUME ~ 1 \ USERNA ~ 1 \ LOCALS ~ 1 \ Temp \ prog.exe와 같이 디렉터리를 지정하면 중단됩니다.

내 프로그램에서 물결표 파일 이름을 해제하여 작동시킬 디렉토리 이름을 지정할 수 있습니까? (난 항상 언어와 API 설계 문제를 해결처럼, 자바 File.createTempFile()와 java.io.tmpdir을 맹 글링 된 파일 이름으로 평가해야 할 어떤 이유는?가 있기 때문에 그리고)

답변

10

당신은 사용할 수 있습니다 getCanonicalPath() 확장 된 경로를 가져옵니다. 예컨대는 :

try 
{ 
    File file = File.createTempFile("abc", null); 
    System.out.println(file.getPath()); 
    System.out.println(file.getCanonicalPath()); 
} 
catch (IOException e) {} 

...

C:\DOCUME~1\USERNA~1\LOCALS~1\Temp\abc49634.tmp 
C:\Documents and Settings\username\Local Settings\Temp\abc49634.tmp 

내가 XP에서 테스트 ... 생산하지만 다른 Windows 운영 체제에서 유사하게 작동합니다 가정합니다.

두 번째 질문에 대한 @ raviaw의 답변을 참조하십시오.

+0

이것이 내 문제보다 나은 답변이지만 내 답변보다 나은 답변입니다. –

+0

실제로 파일 이름을 제거하는 것처럼 보입니다! 그래도 내가 달리면 어떻게 든 그것은 아직도 달려있다. 나는 왜, 아직, 이해하지만, 그것에 노력하고 ... – skiphoppy

+0

아 하! 실행 파일의 압축을 풀 때 사용한 OutputStream에 close()를 호출해야했습니다. 내 테스트에서 밝혀졌지만 응용 프로그램에서 여전히 사용중인 (및 closed()가 아닌) 실행 파일에 대해 잘못된 파일 이름을 전달했으며 더 이상 사용되지 않은 이전 추출에 전체 파일 이름을 전달했습니다. – skiphoppy

3

와우, 나는 그것을 결코 보지 못했다. 그렇지 않아, 새로 만들 자바 VM 임시 폴더 위치를 얻을 수있는 환경 변수를 사용한다고 가정

 
TEMP=C:\DOCUME~1\raviw\LOCALS~1\Temp 
TMP=C:\DOCUME~1\raviw\LOCALS~1\Temp 

: 사실은 환경 변수 % temp %를이 변환 된 이름 (이 내 컴퓨터에서입니다)을 반환한다는 것입니다 디렉토리가 망가질 것이라는 VM의 잘못.

임시 폴더를 가져 오는 데 System.getenv()을 사용해도 여전히 동일한 문제가 발생합니다.

내가 만들 것 확인하십시오 :

  • 문제는 당신이 디렉토리 "prog.exe"(질문에 따라, 나는이 가정입니다)라고 한 사실에 의해 발생되지 않으며,
  • 파일이 "prog.exe"인 경우 다른 프로그램 (바이러스 백신, 어쩌면)에서 사용하지 않은 경우;
  • 컴퓨터가 정상적으로 작동하는지 확인 (웹 응용 프로그램이 아니며 임시 파일이 필요한 응용 프로그램의 경우 매우 위험한 버그입니다).
+0

그의 두 번째 질문에 대한 답변은 +1을 잊어 버렸습니다. – Chris

+0

다른 프로그램에서 사용 중이라는 것을 알았습니다 ... 제가 작성한 응용 프로그램입니다.어느 쪽이 그것을 추출했는지, close()를 호출하지 않았습니다. 그래서 내 테스트에서든 응용 프로그램에서든 실행하려고하는 모든 호출은 close()와 그 결과 디스크로의 플러시를 기다리는 무기한으로 매달려있었습니다. – skiphoppy