我想使用 Runtime.exec() 在带有空格的目录中启动另一个进程。 (听起来很蠢,但我真的很想满足我的好奇心)

问题详情(简化版)
我有一个 myprogram.exe 位于 C:/Program Files/MyProgram。

我观察到的:
1)。当我调用 Runtime.exec("C://Program Files//MyProgram//myprogram.exe") 时,IOException 表示:找不到文件 C:/Program,错误代码 = 2。我认为它必须是一个结果空间的

2)。我试过: Runtime.exec("/"C://Program Files//MyProgram//myprogram.exe/""), IOException 表示:找不到文件:"C:/Program Files/MyProgram/myprogram. EXE文件”

3)。我吸取了教训并尝试了 Runtime.exec() 的重载版本: File dir = new File("C://Program Files//MyProgram//");
然后运行:Runtime.exec("myprogram.exe", null, dir),它说:在 C:/Program Files/MyProgram/中找不到文件 myprogram.exe

4)。我尝试了 1),而不是“Program Files”,我将其重命名为 Program_Files,一切正常

我知道我也可以用ProcessBuilder来做类似的事情,但是我心里放不下……(也许是我的弱点)。谁能告诉我为什么 2) 和 3) 不起作用?

谢谢。

最佳答案

几分钟前看到另一个答案,在评论区,终于找到解决方法了。很抱歉,我不知道该答案是如何被删除的......或者谁通过评论答案给出了答案......

更新:通过一些进一步的调查,我发现是 Matt Kane 通过评论给出了正确的答案。请允许我对您的帮助表示深深的谢意。 ;-)

这是我根据马特的评论解决它的方法,并测试了工作:

String[] cmdArray = new String[]{"C://Program Files//MyProgram//myprogram.exe", arg1, arg2};
Runtime.exec(cmdArray);

其中 arg1 和 arg2 是传递给 myprogram.exe 的两个参数

使用 exec() 的重载版本:

1)进程执行(字符串[] cmdarray)

2)进程执行(String[] cmdarray, String[] envp)

3)Process exec(String[] cmdarray, String[] envp, File dir)

任何一个都会起作用。这里我想提一下 3) 中的 dir 和 cmdarray 中的绝对路径之间的区别,在我的情况下可能是 ""C://Program Files//MyProgram//"。

在3)中的dir中,你可以指定运行.exe的目录,你指定的所有相对目录都会附加在这个目录之后。示例:如果您的目录是 C:/Hello World,并且在您的 .exe 中,您将在/folder1 中存储一个文件,最后您会发现该文件位于 C:/Hello World/folder1

但是, dir 不适用于可执行文件。(在我的情况下,它是 myprogram.exe)。例如,如果您的 .exe 位于 C:/Program Files/MyProgram/,并且您已经将 dir 设置为 C:/Program Files/MyProgram。如果不指定可执行文件的绝对路径,就无法成功运行程序。就我而言,您只能通过以下方式取得成功:
cmdarray[0] = "C://Program Files//MyProgram//myprogram.exe"
如果你弄错了,错误将如下所示:
java.io.exception:无法运行程序“myprogram.exe”(在目录“C:/Program Files/MyProgram/”中):CreateProcess error=2,系统找不到指定的文件。
请注意,它只说“无法在 ** 目录中运行”,而不是说“在 *** 目录中找不到文件”。我认为这很荒谬,但无论如何,这就是它的工作方式。

关于java - Runtime.exec() 带绝对目录,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/1105085/

10-10 11:38