0

I have some console utility. I start process to execute this utility with some parameters. One parameter is filename.

If filename is not contains spaces, all worked. But with spaces I get error from utility: "no such file or directory". If I set filename parameter, still do not work. But interested: if I call utility from command line (not from android/java), all worked. If I replace space on %20, anyway do not work:

1) filename (original): util dir\some test.txt - not worked (java, cmd). It's normal.

2) filename (quates): util "dir\some test.txt" - work in cmd and do not work in java.

3) filename (encode): util "dir\some%20test.txt" - not worked (java, cmd).

PS: utility is ffmpeg

4

4 回答 4

0

Use dir\\some test.txt or dir/some test.txt in Java.

Please Note: \ is an special character(escape) in Java. If you need to use \ as literal as in your example, it should be escaped an addition \ character.

于 2012-11-07T02:06:46.780 回答
0

我假设您正在尝试util "dir\some test.txt"在 Java 中运行,如下所示:

System.exec("util \"dir\\some test.txt\"");

或类似的东西。如果是这样,那么问题在于该exec方法将命令字符串拆分为参数的简单方式。它只是将任何空白字符序列视为参数分隔符,而与引用无关。所以,上面实际上是传递util命令参数"dir\sometest.txt"......这将导致它找不到文件。

处理这个问题的最好方法是使用exec传递字符串数组的重载;例如

System.exec(new String[]{"util", "dir\\some test.txt"});

作为记录:

  • util "dir\some test.txt"在 CMD 中工作,因为 CMD 语言支持使用双引号进行引用。你可以用 POSIX shell 做类似的事情。

  • util "dir\some%20test.txt"失败是因为 CMD 语言不理解百分比转义。URL 中使用了百分比转义 ... 除非相关命令需要 URL 参数,否则它将将该%字符视为普通文件名字符。

最后,“随机”尝试不同类型的引用和转义并不是解决问题的好方法。在尝试解决问题之前,您应该真正尝试了解问题...

于 2012-11-07T02:39:57.317 回答
0

当您启动程序时,每个空格都注册为一个新的“arg”,因此将其拆分为空格意味着程序认为有更多的 args,而不是按照您希望的方式读取文件名。引号仅在 CMD 中有效,因为语法旨在让它如此。你需要一个转义键尝试双反斜杠“\\”并在这里查看llegal-escape-character-followed-by-a-space

于 2012-11-07T02:24:44.577 回答
0

我知道特殊字符。我没有手动设置文件名。我有一些文件,使用getAbsoluteFile()和所有反斜杠都可以。

我执行过程为:

    ProcessBuilder pbuilder = new ProcessBuilder(cmd);
    Process proc = pbuilder.start();

其中 cmd 是我的命令:util filename

升级版:

现在使用带有参数 String[] 的 ProcessBuilder。工作。

于 2012-11-07T03:01:23.740 回答