Ik schrijf een programma in java dat winrar zou uitvoeren en een jar-bestand voor mij zou uitpakken dat in h:\myjar.jar
is geplaatst in de map h:\new
. Mijn Java-code ziet er ongeveer zo uit
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();
}
}
}
Als ik dit uitvoer, krijg ik deze foutmelding
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
Kan iemand me vertellen waarom ik zo’n probleem tegenkom. Wat is de wijziging die ik in de code moet opnemen zodat deze werkt?
Antwoord 1, autoriteit 100%
Ervan uitgaande dat winrar.exe
in de PATH
bevindt, dan Runtime.exec
is in staat om het te vinden, als het dat niet is, Zal het volledig gekwalificeerd pad eraan moeten leveren, bijvoorbeeld, ervan uitgaande dat winrar.exe
is geïnstalleerd in C:/Program Files/WinRAR
U zou iets dergelijks moeten gebruiken. ..
p=r.exec("C:/Program Files/WinRAR/winrar x h:\\myjar.jar *.* h:\\new");
Persoonlijk zou ik aanbevelen dat u ProcessBuilder
gebruikt, omdat deze onder andere een aantal extra configuratiecijfers heeft. Waar mogelijk moet u ook uw opdracht en parameters scheiden in afzonderlijke String
elementen, het behandelt dingen zoals spaties veel beter dan een enkele String
variabele, bijvoorbeeld …
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();
Vergeet niet om de inhoud van de InputStream
van het proces te lezen, omdat dit niet het proces mag stallen
Antwoord 2, Autoriteit 48%
Ik heb processbuilder gebruikt, maar had hetzelfde probleem. Het probleem was met het gebruik van commando als één string-lijn (zoals ik het in cmd zou typen) in plaats van stringarray. In voorbeeld van bovenaf. Als ik
liep
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();
Ik heb een fout opgetreden. Maar als ik
liep
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();
alles was in orde.
Antwoord 3, autoriteit 27%
De dir
die je hebt opgegeven, is een werkmap van het lopende proces – het helpt niet om een uitvoerbaar bestand te vinden. Gebruik cmd /c winrar ...
om het proces uit te voeren dat op zoek is naar een uitvoerbaar bestand in PATHof probeer het absolutepad naar winrar.
Antwoord 4, autoriteit 5%
Het volledige eerste argument van exec
wordt geïnterpreteerd als het uitvoerbare bestand. Gebruik
p = rt.exec(new String[] {"winrar.exe", "x", "h:\\myjar.jar", "*.*", "h:\\new" }
null,
dir);
Antwoord 5, autoriteit 5%
Mijn aanbeveling is om de getRuntime().exec
te behouden omdat exec
de ProcessBuilder
gebruikt.
Probeer
p=r.exec(new String[] {"winrar", "x", "h:\\myjar.jar", "*.*", "h:\\new"}, null, dir);