我特别需要在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也没有帮助。
欢迎任何想法。
答案 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/");