我正在从Java代码本身创建一个运行C,C ++和Java的项目。它对Java来说非常好用,在编译和执行C和C ++文件时会遇到问题。
我使用此code获得了正确的编译,我可以获取在指定路径中生成的可执行文件。但是现在当我从ProcessBuilder
运行可执行二进制文件时,我收到一条错误消息,说“找不到文件”。请查看代码并告诉我出了什么问题以及在哪里?
public void processCode(String path,String lang)throws IOException
{
String cmd="",s=null,out=null,file="";
totalTime=0;
ProcessBuilder process=new ProcessBuilder();
process.directory(new File(path));
if(lang.equals("c")||lang.equals("cpp"))
{
cmd=threadNum+".exe";
process.command(cmd);
}
else if(lang.equals("java"))
{
cmd="java";
file="Main"+threadNum;
process.command(new String[]{cmd,file});
}
process.redirectInput(new File(PATH+"Input\\" + prob + ".txt"));
process.redirectOutput(new File(PATH+"Output.txt"));
Process p=process.start();
long start=System.currentTimeMillis();
while (true)
{
try{
if(p.exitValue()==0)
{
totalTime=(int)(System.currentTimeMillis()-start);
break;
}
}
catch (Exception e)
{
}
if(System.currentTimeMillis()-start>2000)
{
res=1;
p.destroy();
break;
}
}
if(res!=1)
{
compareFile();
}
}
从here调用该方法 产生的错误是:
Exception in thread "main" java.io.IOException: Cannot run program "19.exe" (in directory "C:\wamp\www\usercodes\lokesh"): CreateProcess error=2, The system cannot find the file specified
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)
at Contest.processCode(Main.java:202)
at Contest.compileCode(Main.java:180)
at Contest.makeFile(Main.java:157)
at Contest.main(Main.java:53)
at Main.main(Main.java:15)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
Caused by: java.io.IOException: CreateProcess error=2, The system cannot find the file specified
at java.lang.ProcessImpl.create(Native Method)
at java.lang.ProcessImpl.<init>(ProcessImpl.java:188)
at java.lang.ProcessImpl.start(ProcessImpl.java:132)
at java.lang.ProcessBuilder.start(ProcessBuilder.java:1021)
... 10 more
答案 0 :(得分:14)
设置ProcessBuilder的directory
对系统在尝试启动进程时查找可执行文件的位置没有任何影响。它只是将新创建的进程的当前工作目录设置为该目录,如果它能够成功启动进程的话。您的程序19.exe
可能存在于C:\wamp\www\usercodes\lokesh
中,但除非此文件夹位于PATH上,否则系统将无法启动您的流程。
尝试使用可执行文件的完整路径而不仅仅是19.exe
来运行该过程。
必须说错误信息有点误导。它说它无法找到你的可执行文件,然后它会显示“在目录中......”,这意味着它就是它正在寻找的地方。