1. ホーム
  2. java

[解決済み] CreateProcess error=2, The system cannot find file specified.

2022-02-05 19:11:50

質問

javaでプログラムを書いています。 h:\myjar.jar をフォルダにコピーします。 h:\new . 私の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

なぜこのような問題が発生するのか、どなたか教えていただけませんか。この問題を解決するために、私はどのような変更をコードに加える必要があるのでしょうか?

解決方法を教えてください。

と仮定すると winrar.exePATH であれば Runtime.exec はそれを見つけることができますが、そうでない場合は、その完全修飾パスを指定する必要があります。 winrar.exe がインストールされるのは C:/Program Files/WinRAR のようなものを使う必要があります。

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

個人的には ProcessBuilder を使用することで、いくつかの追加設定機能を使用することができます。 また、可能であれば、コマンドとパラメータを別々の String その方が、1つの 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 プロセスを停止させる可能性があります。