在包含Java空格的工作目录中执行外部可执行文件?

时间:2010-12-03 08:04:38

标签: java processbuilder

我特别需要在Os x上执行程序时在不同子目录中找到的unrar文件。我这样做是通过调用免费软件命令行工具unrar,它工作得很好。 但是,unrar将始终在当前工作目录中的unrar文件,这意味着我必须为执行的进程指定一个工作目录,或者在我的.jar主文件夹中获取每个解压缩的文件。 这很容易使用processBuilder.directory(dir)或runTime.getRuntime().exec(args,null,dir),例如dir是File。 这工作很好,但工作目录包含空格时不是。举个简短​​的例子:

File dir=new File("/Users/chargedPeptide/rar 2");
String[] cmd = { "/Users/chargedPeptide/rar/unrar", "e", "-o+","/Users/chargedPeptide/rar", "2/weather.rar"};
Process pr = Runtime.getRuntime().exec(cmd,null,dir);
int exitValue=pr.waitFor();

使用时不会有效:Process pr = Runtime.getRuntime().exec(cmd);会成功启动命令,但请将所有文件留在jars工作目录中。 使用processbuilder而不是使用p rocessbuilder.directory(dir);来设置目录 退出并显示以下消息:

Exception: Cannot run program "/Users/chargedPeptide/rar/unrar" (in directory "/Users/chargedPeptide/rar 2"): error=2, No such file or directory

帮助?我该如何处理这些空间?我尝试在空格之前添加反斜杠,使它们对文字没有帮助,因为File对象将它们视为路径的实际部分。

编辑:使整个事情更加明确: 1.我有一个单独的方法,它将执行方法的命令和目录提供给processbuilder,所有目录都是由前一个方法找到并存在的。除非dir包含空格,否则此方法有效。 2.我需要设置工作目录或命令将在错误的地方执行。 3.通过以下方式解析文件对象:     dir = new File(dir.tostring.replace(“”,“\”); 在所有空格前面放一个反斜杠不起作用,因为java File对象然后查找包含实际反斜杠的路径。没运气。 4.使用rt.exec而不是processbuilder也没有帮助。

欢迎任何想法。

2 个答案:

答案 0 :(得分:1)

怎么样:

dir.mkdirs();

在启动流程之前。

这会创建缺少的目录。

修改

这看起来很奇怪。

String[] cmd = { "/Users/chargedPeptide/rar/unrar", "e", "-o+","/Users/chargedPeptide/rar", "2/weather.rar"};

如果这是你写的shell:

unrar e -o+ "/Users/chargedPeptide/rar 2/weather.rar"

您实际上必须将.rar文件放在引号中,否则它将被解释为该进程的2个参数。

你分割'cmd'的方式就是这样做,将rar参数分成两部分。尝试:

String[] cmd = { "/Users/chargedPeptide/rar/unrar", "e", "-o+","/Users/chargedPeptide/rar 2/weather.rar"};

答案 1 :(得分:0)

不确定它是否可行,但您可以尝试在路径的末尾添加/。 即,

File dir=new File("/Users/chargedPeptide/rar 2/");