private String ExeName="dc64cmd.exe";
private String Dir=System.getenv("ProgramFiles(x86)") +"\\12noon Display Changer\\";
private String DetachArgument = "-monitor=\"PnP-Monitor (Standard)\" -detach";
try {
System.out.println(new File(Dir+ExeName).exists());
//This prints "true" as expected.
ProcessBuilder pb = new ProcessBuilder(ExeName, DetachArgument);
pb=pb.directory(new File(Dir));
pb=pb.redirectError(ProcessBuilder.Redirect.INHERIT);
pb=pb.redirectOutput(ProcessBuilder.Redirect.INHERIT);
pb=pb.redirectInput(ProcessBuilder.Redirect.INHERIT);
//afaik the 3 lines above are not necessary. But just to be sure..
pb.start();
} catch (java.io.IOException IOexc) {
System.err.println(IOexc.toString());
}
程序的输出是
true
java.io.IOException: Cannot run program "dc64cmd.exe" (in directory "C:\Program Files (x86)\12noon Display Changer"): CreateProcess error=2, Das System kann die angegebene Datei nicht finden
最后一部分是德语本地化版本“系统无法找到文件。
我不明白为什么一方面文件存在,但另一方面却找不到它。
我潜入了java.lang.ProcessBuilder并发现,Exception实际上是在第189行的java.lang.ProcessImpl.java中抛出的
handle = create(cmdstr, envblock, path,
stdHandles, redirectErrorStream);
此异常导致java.lang.ProcessImpl.Start(...)(从第83行开始)关闭try-statement的finally子句中的FileInputStreams和FileOutputStreams。 但是,在调试时我注意到f2.close()(line141)被调用两次,导致抛出异常,然后被解释为未知文件。
我的第一个猜测是一个错误,但我认为我的代码相当微不足道,不应该提出一个未知的错误。
更确切地说,我在代码中犯了一个愚蠢的小错误......
我希望你能读懂我糟糕的英语和糟糕的风格,我不习惯写代码......
感谢任何帮助。
jdk 1.7.0_03
编辑:提及我想要运行的文件是64位可执行文件可能很重要,尽管我将它安装在x86文件夹中。
答案 0 :(得分:0)
请尝试
new ProcessBuilder(Dir+ExeName,
"-monitor=\"PnP-Monitor (Standard)\"",
"-detach");
这将解决两件事:
detachArgument
实际上似乎是两个论点。答案 1 :(得分:-1)
我很确定这可能是问题
pb=pb.directory(new File(Dir));
pb=pb.redirectError(ProcessBuilder.Redirect.INHERIT);
pb=pb.redirectOutput(ProcessBuilder.Redirect.INHERIT);
pb=pb.redirectInput(ProcessBuilder.Redirect.INHERIT);
一个开始pb.directory
返回一个java.io.File,这样你只是重定向目录文件的输出?
也许试试这个;
ProcessBuilder pb = new ProcessBuilder(ExeName, DetachArgument);
pb.directory(new File(Dir));
Im ziemlich sicher,dass die das Problemseinkönnte
pb = pb.directory (new File (dir));
pb = pb.redirectError (ProcessBuilder.Redirect.INHERIT);
pb = pb.redirectOutput (ProcessBuilder.Redirect.INHERIT);
pb = pb.redirectInput (ProcessBuilder.Redirect.INHERIT);
FüreinenStart pb.directory
gibt einen java.io.File so Ihr gerade Umleiten der Ausgabe einer Datei des Verzeichnisses?
Vielleicht versuchen Sie去世;
ProcessBuilder pb = new ProcessBuilder (EXEName, DetachArgument);
pb.directory (new File (dir));