2013-10-27 3 views
14

Я пишу программу в java, которая выполнила бы winrar и распакует файл jar для меня, помещенный в h: \ myjar.jar, в папку h: \ new. Мой Java код выходит что-то вроде этогоОшибка CreateProcess = 2, система не может найти указанный файл

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 

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

+0

Спасибо и так много для ур помочь ... – Trijit

ответ

28

Предполагая, что 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 из процесса, так как это не может привести к остановке процесса

+0

мой случай просто я положил путь к bin для этого exe в своих системных переменных в windows – shareef

+0

Я запустил код python с полным путем в каталог python.exe. Спасибо – vis

1

Полный первый аргумент exec интерпретируется как исполняемый файл. Используйте

p = rt.exec(new String[] {"winrar.exe", "x", "h:\\myjar.jar", "*.*", "h:\\new" } 
      null, 
      dir); 
+0

Пробовал, но я получаю ту же ошибку ... – Trijit

+0

ли 'winrar.exe' на вашем пути? – Reimeus

+0

Я только что установил winrar ...я не установил путь к среде для winrar – Trijit

7

dir Указан рабочий каталог процесса работы - это не поможет найти исполняемый файл. Используйте cmd /c winrar ... для запуска процесса, который ищет исполняемый файл в PATH или попробуйте использовать absolute путь к winrar.

+0

Можете ли вы, пожалуйста, сказать мне команду для познания абсолютного пути ..? – Trijit

+0

Даже если я выполняю эту команду. – Trijit

+0

p = rt.exec (новый String [] {"C: \ Program Files \ WinRAR \ winrar.exe", "x", "h: \\ myjar.jar", " *. * "," h: \\ new "} null, dir); ... я все равно получаю ту же ошибку. – Trijit

5

Я использовал 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(); 

все было в порядке.

+0

Это исправлено для меня. Важным было описание 'pb.directory (...)'. Как упоминалось ниже, как только вы это сделаете, вы можете просто иметь имя exe в качестве первого аргумента команды. Мне также пришлось использовать cmd/c так, чтобы он 'Список params = Arrays.asList (" cmd ","/c "," quack1.exe "," inputfile.txt "," param1 "," param2 "," A "); \t \t \t ProcessBuilder pb = new ProcessBuilder (params); \t \t \t pb.directory (новый файл («C:/dev/test»)); \t \t \t Процесс pr = (pb) .start(); ' –

1

Рекомендация состоит в том, чтобы сохранить getRuntime().exec, поскольку exec использует ProcessBuilder.

Попробуйте

p=r.exec(new String[] {"winrar", "x", "h:\\myjar.jar", "*.*", "h:\\new"}, null, dir); 
Смежные вопросы

 Смежные вопросы