CreateProcess error=2, Het systeem kan het opgegeven bestand niet vinden

Ik schrijf een programma in java dat winrar zou uitvoeren en een jar-bestand voor mij zou uitpakken dat in h:\myjar.jaris 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.exein de PATHbevindt, dan Runtime.execis in staat om het te vinden, als het dat niet is, Zal het volledig gekwalificeerd pad eraan moeten leveren, bijvoorbeeld, ervan uitgaande dat winrar.exeis geïnstalleerd in C:/Program Files/WinRARU 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 ProcessBuildergebruikt, omdat deze onder andere een aantal extra configuratiecijfers heeft. Waar mogelijk moet u ook uw opdracht en parameters scheiden in afzonderlijke Stringelementen, het behandelt dingen zoals spaties veel beter dan een enkele Stringvariabele, 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 InputStreamvan 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 dirdie 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 execwordt 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().execte behouden omdat execde ProcessBuildergebruikt.

Probeer

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

Other episodes