Не удалось выполнить exe-файл из java с помощью ProcessBuilder

Я делаю проект для запуска C, C++ и Java из самого кода Java. Он отлично работает для Java, и проблема возникает при компиляции и выполнении файлов C и C++.

Я получил правильную компиляцию с помощью этого кода и могу получить исполняемый файл, созданный по указанному мной пути. Но теперь, когда я запускаю исполняемый двоичный файл из 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();
        }
    }

Метод вызывается из здесь. Возникает следующая ошибка:

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

person Wayne Rooney    schedule 30.06.2012    source источник
comment
Здесь очевиден отдел bleedin, но вы на самом деле нигде не сказали, что проверяли, и C:\wamp\www\usercodes\lokesh\19.exe определенно существует. Имеет ли это?   -  person Malcolm Smith    schedule 30.06.2012
comment
Да, это так .. Я упомянул, что могу получить файл .exe, сгенерированный по указанному мной пути, и вы также можете увидеть ссылку, чтобы подтвердить это.   -  person Wayne Rooney    schedule 30.06.2012


Ответы (1)


Установка directory для ProcessBuilder не влияет на то, где система будет искать исполняемый файл при попытке запустить процесс. Он просто устанавливает текущий рабочий каталог вновь созданного процесса в этот каталог, если он сможет успешно запустить процесс. Ваша программа 19.exe вполне может существовать в C:\wamp\www\usercodes\lokesh, но если эта папка не указана в ПУТИ, система не сможет запустить ваш процесс.

Попробуйте запустить процесс, используя полный путь к исполняемому файлу, а не просто 19.exe.

Надо сказать, что сообщение об ошибке несколько вводит в заблуждение. Он говорит, что не смог найти ваш исполняемый файл, а затем говорит «в каталоге ...», что означает, что он искал его именно там.

person Luke Woodward    schedule 30.06.2012