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

Tri*_*jit 25 java process

我正在用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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

当我执行此操作时,我收到此错误

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
Run Code Online (Sandbox Code Playgroud)

有人能告诉我为什么遇到这样的问题.我需要在代码中加入哪些更改以使其有效?

Mad*_*mer 39

假设它winrar.exePATH,然后Runtime.exec能够找到它,如果不是,你将需要提供它的完全限定路径,例如,假设winrar.exe安装在C:/Program Files/WinRAR你需要使用类似的东西...

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

就个人而言,我建议您使用,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();
Run Code Online (Sandbox Code Playgroud)

不要忘记阅读过程中的内容InputStream,因为如果不这样做可能会拖延进程


小智 14

我使用过ProcessBuilder但遇到了同样的问题.问题是使用命令作为一个String行(就像我在cmd中键入它)而不是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();
Run Code Online (Sandbox Code Playgroud)

我收到了一个错误.但如果我跑了

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();
Run Code Online (Sandbox Code Playgroud)

一切都很好.


via*_*tor 10

dir您指定的是正在运行的进程的工作目录-它并不能帮助找到可执行文件.使用cmd /c winrar ...运行过程中寻找可执行文件路径或尝试使用绝对路径WinRAR的.