CreateProcess error=2,系统找不到指定的文件

新手上路,请多包涵

我正在用 java 编写一个程序,它将执行 winrar 并将我放在 h:\myjar.jar 中的 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

谁能告诉我为什么我会遇到这样的问题。我需要在代码中加入什么更改才能使其正常工作?

原文由 Trijit 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 3.5k
2 个回答

假设 winrar.exe Runtime.exec PATH 找到它,如果它不是,则需要提供完全合格的路径,例如,假设 winrar.exe 安装在 C:/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 的内容,因为不这样做可能会使进程停止

原文由 MadProgrammer 发布,翻译遵循 CC BY-SA 3.0 许可协议

我使用了 ProcessBuilder 但遇到了同样的问题。问题是将命令用作一个字符串行(就像我在 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();

一切都很好。

原文由 EagleEye1984 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题