1

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

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 并使用 processbuilder.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,所有目录都由前一个方法找到并存在。除非目录包含空格,否则此方法有效。2.我需要设置工作目录,否则命令会在错误的地方执行。3.通过以下方式解析文件对象: dir=new File(dir.tostring.replace(" ","\ "); 将反斜杠放在所有空格前面不起作用,因为 java File 对象然后查找包含的路径实际的反斜杠。没有运气。4.使用 rt.exec 而不是 processbuilder 也无济于事。

欢迎任何想法。

4

2 回答 2

1

怎么样:

dir.mkdirs();

在启动进程之前。

这将创建缺少的目录。

编辑

这看起来很奇怪。

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

如果这是一个外壳,你会写:

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"};
于 2010-12-03T08:22:14.553 回答
0

不确定它是否会起作用,但是您可以尝试将 / 放在路径的末尾。IE,

File dir=new File("/Users/chargedPeptide/rar 2/");
于 2010-12-03T08:26:30.717 回答