2010-05-20 3 views
1

기존 .exe 파일을 한 디렉토리에서 다른 디렉토리로 복사하고 나중에 Java로 실행하려고합니다. 이처럼 :Java : exe 파일 복사 및 이후 실행 실패

FileIO.copy(new File(sourceFile), new File(targetFile)); 
System.out.println("Existing: " + new File(targetFile).exists()); 
System.out.println("Launching " + targetFile); 
String cmd[] = { targetFile }; 
Process p = Runtime.getRuntime().exec(cmd); 
p.waitFor(); 
System.out.println("Result: " + p.exitValue()); 

결과는 다음과 같다 :

Existing: true 
Launching C:\test\Launcher.new.exe 
Result: 2 

그래서 자바 파일이 유효하고 기존이지만, 파일이 아닌 생각하기 때문에 윈도우 그냥 프로세스를 시작할 수 없습니다 말한다 그곳에. pathes는 백 슬래시로 절대적입니다. 또한 파일에 대한 모든 권한을 가지고 있으므로 실행할 수 있습니다. Launcher.new.exe는 Launch4j에 의해 생성되므로 다소 독립형입니다. 적어도 그것은 같은 폴더에있는 DLL에 의존하지 않습니다. 하지만 이상한 점 : notepad.exe를 복사하고 실행하면 작동합니다.

하나 더 이상한 점 : Java로 파일을 복사하지 않고 손으로 복사해도 동일한 오류가 발생하여 실행이 실패합니다.

OS는 Vista SP1입니다.

단서가 있습니까?

+0

ProcessMonitor는 파일이 시작되었다는 오류와 클레임을 표시하지 않습니다.그러나 이후에는 아무 일도 일어나지 않았다. – Philip

+0

당신은 어떤 종류의 과정을 시작하려고합니까? Vista에서는 UAC에 파울이 떨어질 수 있습니다. – mdma

+0

그것은 나에 의해 개발 된 .exe입니다. UAC가 튀어 나오지 않습니다. 또한 샌드 박스와 같은 기능을 가진 "보안 소프트웨어"도 없습니다. – Philip

답변

0

흠 ... 당신은 프로그램 파일 내에

노력하고 있습니다 ...이 놀이에 비스타의 멋진 사용자 액세스 제어 될 수 궁금해? 그렇다면 모든 것을 개별 폴더 (c : \ CopyTest)로 이동하고 다시 시도하십시오. 도움이되는지 확인하십시오.

+0

"C : \ test"폴더에서 이미 테스트를하고 있습니다. 나는 어떤 종류의 이상한 가상화를 의심하지만, 어떻게 체크해야할지 모르겠습니다. – Philip

+0

관리자 비스타를 사용하면 어떤 비스타를 배제 할 수 있습니까? –

+0

관리자로 이미 실행 중입니다. – Philip

0

경로에 슬래시가 포함되어 있으면 exec ing 앞에 백 슬래시로 변경해보십시오. . 또한 드라이브 문자와 콜론 (예 : C:\test\myprog.exe)을 포함하여 절대 경로를 만들어야합니다. 자바 문자열에서 경로를 코딩하는 경우 백 슬래시를 두 배로 늘려야합니다. ...

일단 작동하면 파생 된 내용을 파악할 때까지 이러한 제약을 완화 할 수 있습니다.


편집 1 : exec() 일부 일반적인 함정은 this article에 언급되어있다. 나는 이들 중 어느 것도 적용하지 않는다고 생각하지만, 마지막 예제의 코드를 사용하여 CMD.EXE 안에 .EXE를 실행하여 적절한 경로 분석, 오류 처리 등을 얻을 수 있습니다.


EDIT 2 : 실행 파일 이름을 긴 파일 이름으로 해석해야합니다. 나는 API가 이것을 처리 할 수 ​​있다는 것에 긍정적이지 않다. NEWPROG.EXE (이름에 두 번째 점이 없어도!)와 같이 짧고 간단한 이름을 테스트 해보십시오.하지만 먼저 CMD.EXE를 먼저 시도해보십시오.


편집 3 : 다른 대답에 주석을 읽기에서 : 가능 프로그램이 실제로 실행되고, 그 자체가 파일을 찾기 위해 실패 2 그것은때문에 상태를 반환인가? Java 프로그램에서 실행하는 .CMD 일괄 처리 스크립트에서이 프로그램을 호출하고 출력을 파일로 리디렉션하도록 작성하여 프로그램 작동을 확인할 수있는 방법이 있습니까?

+0

pathes는 절대적이며 역 슬래시입니다. 언급하는 것을 잊어 버렸습니다. :) – Philip

+0

실제 경로와 파일 이름을 추가했습니다. – Philip

+0

Windows에서 역/슬래시는 중요하지 않습니다. – BalusC

0

자세한 내용이 없으면 특정 답변을하기가 어렵습니다. c : \ test 디렉토리에 대한 권한과 실행하려는 대상 파일에 대한 권한을 확인하십시오.

+0

자세한 내용을 추가하고 싶습니다. 무엇이 누락 되었습니까? 자리 표시자는 실제 경로와 파일 이름으로 바뀌 었습니다. – Philip

+0

exe가 dll에 의존합니까? 같은 폴더에 있습니까? – mdma

+0

exe는 다소 독립형입니다. 그것은 Launch4j에 의해 생성됩니다. – Philip