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.
descargue la última versión de jdk y cambie la ubicación de jdk desde la configuración del proyecto de Android Studio como nueva ubicación de jdk. http://download.oracle.com/otn-pub/java/jdk/8u181-b13/96a7b8442fe848ef90c96a2fad6ed6d1/jdk-8u181-windows-x64.exe?AuthParam=1539152029_7892043961e90bd9f5bdfc884ddf0b07
si esto no es un trabajo, establezca su ruta PATH a partir de variables avanzadas del sistema como nueva ubicación jdk