Ошибка CreateProcess = 2, система не может найти указанный файл
Я пишу программу в java, которая выполнит winrar и распакует файл jar для меня, помещенный в h:\myjar.jar в папку h:\new. Мой код Java выглядит примерно так:
import java.io.File;
import java.io.IOException;
public class MainClass {
public static void main(String[] args) {
Runtime r=Runtime.getRuntime();
Process p=null;
try {
File dir=new File("C:/Program Files/WinRAR");
p=r.exec("winrar x h:\\myjar.jar *.* h:\\new",null,dir);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Когда я выполняю это, я получаю эту ошибку
java.io.IOException: Cannot run program "winrar" (in directory "C:\Program Files\WinRAR"): CreateProcess error=2, The system cannot find the file specified
at java.lang.ProcessBuilder.start(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
at MainClass.main(MainClass.java:16)
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>(Unknown Source)
at java.lang.ProcessImpl.start(Unknown Source)
... 4 more
Может ли кто-нибудь сказать мне, почему я столкнулся с такой проблемой. Какое изменение мне нужно включить в код, чтобы он работал..?
Ответы
Ответ 1
Предполагая, что winrar.exe
находится в PATH
, тогда Runtime.exec
может его найти, если это не так, вам нужно будет предоставить ему полный путь, например, если winrar.exe
установленный в C:/Program Files/WinRAR
, вам нужно будет использовать что-то вроде...
p=r.exec("C:/Program Files/WinRAR/winrar x h:\\myjar.jar *.* h:\\new");
Лично я бы рекомендовал использовать ProcessBuilder
, поскольку у него есть некоторые дополнительные возможности настройки среди других вещей. Там, где это возможно, вы также должны отделить свою команду и параметры от отдельных элементов String
, но они имеют дело с вещами вроде пространства намного лучше, чем одна переменная String
, например...
ProcessBuilder pb = new ProcessBuilder(
"C:/Program Files/WinRAR/winrar",
"x",
"myjar.jar",
"*.*",
"new");
pb.directory(new File("H:/"));
pb. redirectErrorStream(true);
Process p = pb.start();
Не забудьте прочитать содержимое InputStream
из процесса, поскольку это не может остановить процесс
Ответ 2
Указанный dir
- это рабочий каталог запущенного процесса - это не помогает найти исполняемый файл. Используйте cmd /c winrar ...
для запуска процесса поиска исполняемого файла в PATH или попробуйте использовать абсолютный путь к winrar.
Ответ 3
Я использовал ProcessBuilder, но имел ту же проблему. Проблема заключалась в использовании команды в качестве одной строки String (например, я бы вводил ее в cmd) вместо массива String. В примере сверху. Если я запустил
ProcessBuilder pb = new ProcessBuilder("C:/Program Files/WinRAR/winrar x myjar.jar *.* new");
pb.directory(new File("H:/"));
pb. redirectErrorStream(true);
Process p = pb.start();
У меня возникла ошибка. Но если я запустил
ProcessBuilder pb = new ProcessBuilder("C:/Program Files/WinRAR/winrar", "x", "myjar.jar", "*.*", "new");
pb.directory(new File("H:/"));
pb. redirectErrorStream(true);
Process p = pb.start();
все было в порядке.
Ответ 4
Полный первый аргумент exec
интерпретируется как исполняемый файл. Используйте
p = rt.exec(new String[] {"winrar.exe", "x", "h:\\myjar.jar", "*.*", "h:\\new" }
null,
dir);
Ответ 5
Я рекомендую сохранить getRuntime().exec
, потому что exec
использует ProcessBuilder
.
Try
p=r.exec(new String[] {"winrar", "x", "h:\\myjar.jar", "*.*", "h:\\new"}, null, dir);