visual studio sistema shellexecuteex puede open failed especificado error encontrar code cannot archivo java process

java - studio - shellexecuteex failed code 2 el sistema no puede encontrar el archivo especificado



Error de CreateProcess=2, el sistema no puede encontrar el archivo especificado (6)

Estoy escribiendo un programa en java que ejecutaría winrar y descomprimiría un archivo jar para mí ubicado en h:/myjar.jar en la carpeta h:/new . Mi código java va algo como esto

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) { e.printStackTrace(); } } }

Cuando ejecuto esto, estoy recibiendo este error

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

¿Alguien puede decirme por qué me encuentro con un problema así? ¿Cuál es el cambio que necesito incorporar en el código para que funcione?


El dir que especificó es un directorio operativo del proceso en ejecución, no ayuda a encontrar el ejecutable. Use cmd /c winrar ... para ejecutar el proceso en busca de ejecutables en PATH o intente usar la ruta absoluta para winrar .


El primer argumento completo de exec se interpreta como el ejecutable. Utilizar

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


Mi recomendación es mantener el getRuntime().exec porque exec usa ProcessBuilder .

Tratar

p=r.exec(new String[] {"winrar", "x", "h://myjar.jar", "*.*", "h://new"}, null, dir);


Suponiendo que winrar.exe está en la PATH , entonces Runtime.exec es capaz de encontrarlo; si no lo está, deberá proporcionarle la ruta completa, por ejemplo, suponiendo que winrar.exe está instalado en C:/Program Files/WinRAR necesitarías usar algo como ...

p=r.exec("C:/Program Files/WinRAR/winrar x h://myjar.jar *.* h://new");

Personalmente, recomendaría que utilice ProcessBuilder ya que tiene algunas capacidades de configuración adicionales, entre otras cosas. Siempre que sea posible, también debe separar sus comandos y parámetros en elementos de String separados, trata con cosas como espacios mucho mejor que una sola variable de String , por ejemplo ...

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();

No olvide leer el contenido de InputStream del proceso, ya que si no lo hace puede detener el proceso.


Utilicé ProcessBuilder pero tuve el mismo problema. El problema fue con el uso del comando como una línea de cadena (como lo escribiría en cmd) en lugar de la matriz de cadenas. En el ejemplo de arriba. Si corri

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();

Tengo un error Pero si corriera

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();

todo estuvo bien.