web-dev-qa-db-ja.com

CreateProcessエラー= 2、指定されたファイルが見つかりません

Winrarを実行し、h:\myjar.jarにあるjarファイルをh:\newフォルダーに解凍するプログラムをJavaで作成しています。私のJavaコードは次のようになります

import Java.io.File;
import Java.io.IOException;

public class MainClass {

    public static void main(String[] args) {

        Runtime r = Runtime.getRuntime();
        Process p = null;

        try {
            File dir = new File("C:/Program Files/WinRAR");
            p = r.exec("winrar x h:\\myjar.jar *.* h:\\new", null, dir);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

これを実行すると、このエラーが発生します

Java.io.IOException: Cannot run program "winrar" (in directory "C:\Program Files\WinRAR"): CreateProcess error=2, The system cannot find the file specified
    at Java.lang.ProcessBuilder.start(Unknown Source)
    at Java.lang.Runtime.exec(Unknown Source)
    at Java.lang.Runtime.exec(Unknown Source)
    at MainClass.main(MainClass.Java:16)
Caused by: Java.io.IOException: CreateProcess error=2, The system cannot find the file specified
    at Java.lang.ProcessImpl.create(Native Method)
    at Java.lang.ProcessImpl.<init>(Unknown Source)
    at Java.lang.ProcessImpl.start(Unknown Source)
    ... 4 more

なぜ私がそのような問題に遭遇しているのか誰にも教えてもらえますか。動作するようにコードに組み込む必要がある変更は何ですか?

23
Trijit

winrar.exePATHにあると仮定すると、Runtime.execはそれを見つけることができますが、そうでない場合は、たとえば、winrar.exeC:/Program Files/WinRARにインストールされます。次のようなものを使用する必要があります...

p=r.exec("C:/Program Files/WinRAR/winrar x h:\\myjar.jar *.* h:\\new");

個人的には、ProcessBuilderを使用することをお勧めします。これにはいくつかの追加の構成機能があるためです。可能な場合は、コマンドとパラメーターを個別のString要素に分離する必要があります。たとえば、単一のString変数よりもスペースのようなものを扱います。

ProcessBuilder pb = new ProcessBuilder(
    "C:/Program Files/WinRAR/winrar",
    "x",
    "myjar.jar",
    "*.*",
    "new");
pb.directory(new File("H:/"));
pb. redirectErrorStream(true);

Process p = pb.start();

InputStreamの内容をプロセスから読み取ることを忘れないでください。そうしないと、プロセスが停止する可能性があります。

37
MadProgrammer

ProcessBuilderを使用しましたが、同じ問題がありました。問題は、文字列配列の代わりに、コマンドを1つの文字列行として(cmdで入力するように)使用することでした。上記の例では。走ったら

ProcessBuilder pb = new ProcessBuilder("C:/Program Files/WinRAR/winrar x myjar.jar *.* new");
pb.directory(new File("H:/"));
pb. redirectErrorStream(true);

Process p = pb.start();

エラーが発生しました。しかし、私が走った場合

ProcessBuilder pb = new ProcessBuilder("C:/Program Files/WinRAR/winrar", "x", "myjar.jar", "*.*", "new");
pb.directory(new File("H:/"));
pb. redirectErrorStream(true);

Process p = pb.start();

すべてがOKでした。

12
EagleEye1984

指定したdirは実行中のプロセスの作業ディレクトリです-実行可能ファイルを見つけるのに役立ちません。 cmd /c winrar ...を使用してPATHで実行可能ファイルを探してプロセスを実行するか、absolutepath towinrar

9
viator

execProcessBuilderを使用するため、getRuntime().execを保持することをお勧めします。

試して

 p=r.exec(new String[] {"winrar", "x", "h:\\myjar.jar", "*.*", "h:\\new"}, null, dir);
2
Peter Rader

execの完全な最初の引数は、実行可能ファイルとして解釈されています。つかいます

p = rt.exec(new String[] {"winrar.exe", "x", "h:\\myjar.jar", "*.*", "h:\\new" }
            null, 
            dir);
1
Reimeus