ProcessBuilder не может найти файл ?! - PullRequest
8 голосов
/ 24 марта 2012

Еще один вопрос в быстрой последовательности, но это должно быть действительно очевидной ошибкой, которую я не вижу. Я написал код для запуска командного файла ниже, но получаю сообщение об ошибке, в котором говорится, что он не может найти файл, но я могу заверить вас, что файл действительно существует в каталоге!

public class Pull {

public void pullData() throws IOException {
    ProcessBuilder pb = new ProcessBuilder("adb.bat");
    File f = new File("C:\\");
    pb.directory(f);
    Process p = pb.start();  
}

 public static void main(String[] args) throws IOException {
     Pull pull = new Pull();
     pull.pullData();
 }

}

и вот сообщение об ошибке

Exception in thread "main" java.io.IOException: Cannot run program "adb.bat" (in directory "C:\"): CreateProcess error=2, The system cannot find the file specified

Ответы [ 2 ]

11 голосов
/ 24 марта 2012

Я использую Linux, но та же ошибка возникает, когда я запускаю ваш код (измененный для запуска .sh, а не .bat).

Попытка:

ProcessBuilder pb = new ProcessBuilder("c:\\adb.bat");

Видимо, использование ProcessBuilder.directory не влияет на рабочий каталог ( в целях обнаружения исполняемого файла ), который был выбран при сборке компоновщика (по крайней мере, именно это, похоже, и происходит). скажем, это изменит рабочий каталог, поэтому я предполагаю, что файлы ввода / вывода могут быть относительно этого?)

Я не уверен, что он на самом деле делает внутри, но указание пути к исполняемому файлу в конструкторе решило проблему.

В этом посте рассказывается о проблеме и ее решении , но также поднимается вопрос о необходимости установки переменных среды, из которых переменные, подобные "путям", могут быть полезны, чтобы помочь ProcessBuilder обнаружить исполняемый файл.

2 голосов
/ 24 марта 2012

Здравствуйте, попробуйте использовать учебник здесь - http://www.javabeat.net/examples/2007/08/21/using-the-new-process-builder-class/. Используя его, я немного изменил ваш класс, и он находит файл (обратите внимание, что я не знаю, что находится внутри, поэтому не могу полностью проверить его),Он компилируется и запускается без проблем, в то время как ваши собственные я испытываю те же проблемы, что и вы:

public class Pull {


public void pullData() throws IOException {
    /*ProcessBuilder pb = new ProcessBuilder("adb.bat");
    File f = new File("C:\\");
    pb.directory(f);
    Process p = pb.start(); 
    */
    ProcessBuilder p = new ProcessBuilder("C:\\adb.bat");
     p.start();
    System.out.println(p.toString());
}


 public static void main(String[] args) throws IOException {


     Pull pull = new Pull();
     pull.pullData();

 }


}
...