CreateProcess d'erreur=2, Le système ne peut pas trouver le fichier spécifié
Je suis en train d'écrire un programme en java, ce qui permettrait d'exécuter winrar et décompresser un fichier jar pour moi placé dans h:\myjar.jar
dans le dossier h:\new
. Mon code java va quelque chose comme ceci
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();
}
}
}
Quand j'execute ce, j'obtiens cette erreur
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
Quelqu'un peut me dire pourquoi suis-je rencontre un tel problème. Quel est le changement que j'ai besoin d'intégrer dans le code pour qu'il fonctionne?
Merci u tellement de ur aider...
OriginalL'auteur Trijit | 2013-10-27
Vous devez vous connecter pour publier un commentaire.
En supposant que
winrar.exe
est dans lePATH
, puisRuntime.exec
est capable de le trouver, s'il ne l'est pas, vous aurez besoin de fournir le chemin d'accès complet, par exemple, en supposant quewinrar.exe
est installé dansC:/Program Files/WinRAR
vous devez utiliser quelque chose comme...Personnellement, je recommande que vous utilisez
ProcessBuilder
qu'il a une configuration supplémentaire des capacités, entre autres choses. Si possible, vous devriez aussi vous séparer de votre commande et les paramètres distinctsString
éléments, il s'intéresse à des choses comme des espaces beaucoup mieux que d'un seulString
variable, par exemple...N'oubliez pas de lire le contenu de la
InputStream
de la procédure, de ne pas le faire peut bloquer le processusJ'ai couru code python avec le chemin d'accès complet python.exe répertoire. Merci
OriginalL'auteur MadProgrammer
La
dir
que vous avez spécifié est un répertoire de travail du processus en cours d'exécution - ce qui n'aide pas à trouver l'exécutable. Utilisationcmd /c winrar ...
pour exécuter le processus de la recherche de l'exécutable dans CHEMIN ou essayez d'utiliser absolue chemin à winrar.Même si j'exécute cette commande..
p = rt.exec(new String[] {"C:\Program Files\WinRAR\winrar.exe", "x", "h:\\myjar.jar", ".", "h:\\new" } null, dir);...j'obtiens toujours la même erreur.
que faire si vous effectuez
rt.exec(new String[] {"cmd", "/c", "winrar.exe x h:\\myjar.jar . h:\\new"}, null, dir)
?OriginalL'auteur viator
J'ai utilisé ProcessBuilder mais eu le même problème. La question a été avec l'aide de la commande comme une ligne de Chaîne (comme je le ferais taper cmd) à la place de tableau de chaînes. Dans l'exemple ci-dessus. Si j'ai couru
J'ai eu une erreur. Mais si j'ai couru
tout était OK.
pb.directory(...)
déclaration. Comme d'autres l'ont mentionné ci-dessous, une fois que vous faites cela, vous pouvez juste avoir le nom de l'exe que le premier argument de la commande. Je n'ai également avoir à utiliser le cmd /c commeList<String> params = Arrays.asList("cmd", "/c", "quack1.exe", "inputfile.txt", "param1", "param2", "A"); ProcessBuilder pb = new ProcessBuilder(params); pb.directory(new File("C:/dev/test")); Process pr = (pb).start();
OriginalL'auteur EagleEye1984
L'compléter le premier argument de
exec
est interprété comme l'exécutable. UtilisationEst
winrar.exe
sur votre CHEMIN?Je viens d'installer winrar...je n'ai pas mis le environnement path pour winrar
Il doit être sur le CHEMIN, sinon vous devrez spécifier le chemin d'accès complet avec l'exécutable
OriginalL'auteur Reimeus
Ma recommandation est de garder la
getRuntime().exec
parce queexec
utilise leProcessBuilder
.Essayer
OriginalL'auteur Peter Rader
télécharger jdk version la plus récente et changement d'emplacement du jdk à partir d'android studio de montage de projet en tant que nouveau jdk emplacement.
http://download.oracle.com/otn-pub/java/jdk/8u181-b13/96a7b8442fe848ef90c96a2fad6ed6d1/jdk-8u181-windows-x64.exe?AuthParam=1539152029_7892043961e90bd9f5bdfc884ddf0b07
si ce n'est pas un travail que d'ur CHEMIN d'accès à partir des variables du système en tant que nouveau jdk emplacement
OriginalL'auteur RAVI.SH