1

既存の.exeファイルをあるディレクトリから別のディレクトリにコピーし、後でJavaで起動したいと思います。このような:

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

したがって、Javaはファイルが有効で存在していると言いますが、Windowsはファイルが存在しないと見なすため、プロセスを起動できません。パスは絶対的で、円記号が付いています。また、ファイルに対するすべての権限を持っているので、それらを実行することが許可されています。Launcher.new.exeはLaunch4jによって生成されるため、多かれ少なかれスタンドアロンです。少なくとも、同じフォルダ内のDLLには依存しません。しかし奇妙なことに、notepad.exeをコピーして起動すると機能します。

もう1つ奇妙なことは、ファイルをJavaではなく手動でコピーすると、起動も同じエラーで失敗することです。

OSはSP1を搭載したVistaです。

どんな手掛かり?

4

4 に答える 4

0

パスにスラッシュが含まれている場合は、execing の前にそれらをバックスラッシュに変更してみてください。また、ドライブ文字とコロン (例: C:\test\myprog.exe) を含めて絶対パスにするようにしてください。Java String でパスをコーディングする場合は、バックスラッシュを 2 つにする必要があることに注意してください...

それが機能するようになったら、何が失敗したのかがわかるまで、これらの制約を緩和できます。


編集 1:この記事exec()では、いくつかの一般的な落とし穴について説明します。これらのどれも当てはまらないと思いますが、適切なパス解決、エラー処理などを取得するために、最後の例のコーディングを使用して .EXE を実行することをお勧めします。CMD.EXE


編集 2: 実行可能ファイル名は、長いファイル名として解釈する必要があります。APIがこれを処理できる/処理するかどうかは確信が持てません。.EXE に、NEWPROG.EXE のような短い単純な名前 (テスト用) を付けてみてください (名前に 2 番目のドットも含めないでください!)。


編集 3: コメントの読み取りから他の回答へ: プログラムが実際に実行されていて、ファイルが見つからないためにステータス 2 を返す可能性はありますか? .CMDプログラムの動作を確認する方法はありますか。たとえば、Java プログラムから実行するバッチ スクリプトからプログラムを呼び出し、出力をファイルにリダイレクトして書き込む方法はありますか?

于 2010-05-20T15:01:51.223 に答える
0

うーん... これは、Vista の優れたユーザー アクセス コントロールが機能しているのではないかと思います...

Program Files 内で作業していますか? その場合は、すべてを別のフォルダー (c:\CopyTest) に移動して、もう一度試してください。それが役立つかどうかを確認してください...

于 2010-05-20T14:56:44.743 に答える
0

詳細がなければ、具体的な答えを出すのは難しいです。c:\test ディレクトリに対するアクセス許可と、実行しようとしているターゲット ファイルに対するアクセス許可を確認してください。

于 2010-05-20T15:05:22.017 に答える