Java CreateProcess错误=2,系统找不到指定的文件
我正在用java编写一个程序,该程序将执行winrar并为我解压一个jar文件,该文件位于Java CreateProcess错误=2,系统找不到指定的文件,java,process,Java,Process,我正在用java编写一个程序,该程序将执行winrar并为我解压一个jar文件,该文件位于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();
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
java.io.IOException:无法运行程序“winrar”(在目录“C:\program Files\winrar”中):CreateProcess error=2,系统找不到指定的文件
位于java.lang.ProcessBuilder.start(未知源)
位于java.lang.Runtime.exec(未知源)
位于java.lang.Runtime.exec(未知源)
在MainClass.main(MainClass.java:16)
原因:java.io.IOException:CreateProcess error=2,系统找不到指定的文件
在java.lang.ProcessImpl.create(本机方法)
位于java.lang.ProcessImpl。(未知源)
位于java.lang.ProcessImpl.start(未知源)
... 4更多
有人能告诉我为什么我会遇到这样的问题吗。我需要在代码中加入什么样的更改才能使其工作?exec的完整第一个参数被解释为可执行文件。使用
p = rt.exec(new String[] {"winrar.exe", "x", "h:\\myjar.jar", "*.*", "h:\\new" }
null,
dir);
您指定的
dir
是正在运行的进程的工作目录-它无助于查找可执行文件。使用cmd/c winrar…
运行进程,在路径中查找可执行文件,或者尝试使用winrar的绝对路径。假设winrar.exe
位于路径中,则运行时.exec
能够找到它,如果它不是,则需要为它提供完全限定的路径,例如,假设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
的内容,否则可能会导致进程暂停我使用了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();
一切正常。我的建议是保留getRuntime().exec
,因为exec
使用ProcessBuilder
试一试
winrar.exe
在您的路径上吗?我刚刚安装了winrar…我没有为winrar设置环境路径。它需要在路径上,否则您必须指定完整路径以及可执行文件。您可以告诉我知道绝对路径的命令吗?p=rt.exec(新字符串[]{“C:\Program Files\winrar\winrar.exe”,“x”,“h:\\myjar.jar”,“h:\\new”}null,dir);。。。我仍然收到相同的错误。如果执行rt.exec(新字符串[]{“cmd”,“/c”,“winrar.exe x h:\\myjar.jar.h:\\new”},null,dir)
,会怎么样?这为我修复了它。关键是pb.directory(…)
语句。正如下面提到的其他人一样,一旦这样做,您就可以将exe的名称作为第一个命令参数。我还必须使用cmd/c,比如soList params=Arrays.asList(“cmd”、“/c”、“quack1.exe”、“inputfile.txt”、“param1”、“param2”、“A”);ProcessBuilder pb=新的ProcessBuilder(参数);目录(新文件(“C:/dev/test”);进程pr=(pb.start()
my case刚才我在Windows的系统变量中为该exe设置了bin的路径,我运行了python代码,其中包含python.exe目录的完整路径。非常感谢。
p=r.exec(new String[] {"winrar", "x", "h:\\myjar.jar", "*.*", "h:\\new"}, null, dir);