Подтвердить что ты не робот

Ошибка 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

Может ли кто-нибудь сказать мне, почему я столкнулся с такой проблемой. Какое изменение мне нужно включить в код, чтобы он работал..?

4b9b3361

Ответ 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);