java ProcessBuilder 在文件确实存在时给出“找不到文件”异常
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/14765828/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
ProcessBuilder giving a "File not found" exception when the file does exist
提问by Matthew Salsamendi
Working on an application that will run on a Linux web server to delete logs from a certain directory, however I keep getting a FileNotFound exception.
处理将在 Linux Web 服务器上运行以从某个目录中删除日志的应用程序,但是我不断收到 FileNotFound 异常。
Here is the code:
这是代码:
public static void deleteLOG() {
try {
ProcessBuilder probuilder = new ProcessBuilder("find /home/root/multicraft/servers/ -name '*.log' -delete");
probuilder.start();
} catch (IOException e) {
e.printStackTrace();
}
}
And the exception
和例外
java.io.IOException: Cannot run program "find . -name '*CoreData*' -delete" (in directory "/home/root/multicraft/servers"): error=2, No such file or directory
at java.lang.ProcessBuilder.start(Unknown Source)
at com.mcprohosting.com.nodecleanup.Preprocess.deleteCoreData(Preprocess.java:23)
at com.mcprohosting.com.nodecleanup.handlers.CleanupHandler.executeCleanup(CleanupHandler.java:36)
at com.mcprohosting.com.main.NodeCleaner.init(NodeCleaner.java:29)
at com.mcprohosting.com.main.NodeCleaner.main(NodeCleaner.java:25)
Caused by: java.io.IOException: error=2, No such file or directory
at java.lang.UNIXProcess.forkAndExec(Native Method)
at java.lang.UNIXProcess.<init>(Unknown Source)
at java.lang.ProcessImpl.start(Unknown Source)
... 5 more
However the command cd /home/root/multicraft/servers works perfectly fine.
但是命令 cd /home/root/multicraft/servers 工作得很好。
I've also tried:
我也试过:
ProcessBuilder probuilder = new ProcessBuilder("find . -name '*Backup*' -delete");
probuilder.directory(new File("/home/root/multicraft/servers/"));
probuilder.start();
回答by Isaac
The ProcessBuilder
constructor receives multiple strings - either as a List<String>
or as a variable number of arguments, each of type String
:
所述ProcessBuilder
构造函数接收多个串-无论是作为一个List<String>
或作为参数,每一种类型的可变数量String
:
http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/ProcessBuilder.html#ProcessBuilder(java.util.List)http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/ProcessBuilder.html#ProcessBuilder(java.lang.String...)
http://docs.oracle.com/javase/1.5.0/docs/api/java/lang/ProcessBuilder.html#ProcessBuilder(java.util.List) http://docs.oracle.com/javase/1.5。 0/docs/api/java/lang/ProcessBuilder.html#ProcessBuilder(java.lang.String...)
You're experiencing difficulties because you passed the entire command as one string, causing the JVM to look for a program called "find /home/root/multicraft/servers/ -name '*.log' -delete
", not find
.
您遇到了困难,因为您将整个命令作为一个字符串传递,导致 JVM 查找名为“ find /home/root/multicraft/servers/ -name '*.log' -delete
”的程序,而不是find
.
You'll have to separate the long command into parts. Such as:
您必须将长命令分成几部分。如:
ProcessBuilder pb = new ProcessBuilder("find", ".", "-name", "'*CoreData*"...);
回答by shazin
try {
ProcessBuilder probuilder = new ProcessBuilder("<Absolute Path To>/find /home/root/multicraft/servers/ -name '*.log' -delete");
probuilder.start();
} catch (IOException e) {
e.printStackTrace();
}
<Absolute Path To>
should ideally be /bin or /usr/bin
<Absolute Path To>
理想情况下应该是 /bin 或 /usr/bin
ProcessBuilder probuilder = new ProcessBuilder("find /home/root/multicraft/servers/ -name '*Backup*' -delete");
probuilder.directory(new File("<Absolute Path To>"));
probuilder.start();
probuilder.directory
expects the working directory where find
.
probuilder.directory
需要工作目录,其中find
.