4 Stimmen

Runtime.exec() mit absolutem Verzeichnis

Ich möchte Runtime.exec() verwenden, um einen anderen Prozess in einem Verzeichnis mit Leerzeichen zu initiieren. (Es klingt dumm, aber ich möchte wirklich meine Neugierde befriedigen)

Details des Problems (vereinfachte Version) Ich habe eine myprogram.exe, die sich in C:/Programme/MyProgram befindet.

Was ich beobachte: 1). wenn ich Runtime.exec("C://Program Files//MyProgram//myprogram.exe") aufrufe, zeigt IOException an: can't find file C:/Program, mit Fehlercode = 2. Ich denke, es muss ein Ergebnis der Leerzeichen

2). Ich habe es versucht: Runtime.exec("/"C://Program Files//MyProgram//myprogram.exe/""), IOException zeigt an: can't find the file: "C:/Programme/MeinProgramm/meinProgramm.exe"

3). Ich habe meine Lektion gelernt und versuche eine überladene Version von Runtime.exec(): File dir = new File("C://Program Files//MyProgram//"); Und ausführen: Runtime.exec("meinProgramm.exe", null, dir), und es sagt: can't find file myprogram.exe in C:/Program Files/MyProgram/

4). Ich habe versucht, 1), anstelle von "Program Files", benenne ich es in Program_Files, alles funktioniert

Ich weiß, ich kann auch ProcessBuilder verwenden, um ähnliche Dinge zu tun, aber ich kann es nicht in meinem Herzen gehen lassen... (Vielleicht ist es meine Schwäche). Kann mir jemand sagen, warum 2) und 3) nicht funktionieren?

Danke.

5voto

Lily Punkte 5692

Ich habe gesehen, dass es vor einigen Minuten eine andere Antwort im Kommentarbereich gab, ich habe endlich die Lösung gefunden. Es tut mir leid, dass ich nicht weiß, wie diese Antwort gelöscht wurde... oder wer die Antwort gab, indem er die Antwort kommentierte...

UPDATE: Durch weitere Nachforschungen habe ich herausgefunden, dass es sich um Matt Kane die durch einen Kommentar die richtige Antwort gegeben haben. Erlauben Sie mir, Ihnen meine tiefe Dankbarkeit für Ihre freundliche Hilfe auszudrücken. ;-)

Hier ist, wie ich es angehen nach Matt's Kommentar, und getestet funktioniert:

String[] cmdArray = new String[]{"C://Program Files//MyProgram//myprogram.exe", arg1, arg2};
Runtime.exec(cmdArray);

wobei arg1 und arg2 zwei Parameter sind, die an myprogram.exe übergeben werden

Verwenden Sie die überladene Version von exec():

1)Process exec(String[] cmdarray)

2)Process exec(String[] cmdarray, String[] envp)

3)Process exec(String[] cmdarray, String[] envp, File dir)

Beides ist möglich. Hier möchte ich den Unterschied zwischen dir in 3) und dem absoluten Pfad in cmdarray erwähnen, der in meinem Fall "C://Program Files//MyProgram//" sein könnte.

In dir in 3) können Sie das Verzeichnis angeben, in dem Sie die .exe ausführen, alle relativen Verzeichnisse, die Sie angeben, werden nach diesem Verzeichnis angehängt. Beispiel: Wenn Ihr Verzeichnis C:/Hello World ist, und Sie in Ihrer .exe eine Datei in /Ordner1 speichern, finden Sie die Datei schließlich in C:/Hello World/Ordner1

Dir funktioniert jedoch nicht für die ausführbare Datei (in meinem Fall ist es myprogram.exe). Wenn sich Ihre .exe beispielsweise in C:/Programme/MeinProgramm/ befindet und Sie dir bereits auf C:/Programme/MeinProgramm gesetzt haben. Sie können das Programm nicht erfolgreich ausführen, ohne den absoluten Pfad der ausführbaren Datei anzugeben. In meinem Fall können Sie das nur durch: cmdarray[0] = "C://Programmdateien//MeinProgramm//meinProgramm.exe" Wenn Sie es falsch machen, sieht der Fehler wie folgt aus: java.io.exception: Das Programm "myprogram.exe" (im Verzeichnis "C:/Program Files/MyProgram/") kann nicht ausgeführt werden: CreateProcess error=2, Das System kann die angegebene Datei nicht finden. Beachten Sie, dass es nur heißt: "Kann nicht in Verzeichnis ** ausgeführt werden", anstatt "Kann Datei in Verzeichnis *** nicht finden". Ich fand das ziemlich lächerlich, aber so funktioniert es nun mal.

0voto

Chochos Punkte 5120

Versuchen Sie, einen Backslash vor das Leerzeichen zu setzen... "C:/Programme\ und\ Dateien/MeinProgramm/meinProgramm.exe"

müssen Sie einen doppelten Backslash verwenden, damit er an das Betriebssystem weitergegeben wird.

Wenn das nicht funktioniert, versuchen Sie "C:/\"Programme und Dateien\"/MyProgram/myprogram.exe".

0voto

Gonen I Punkte 4891

Ich hatte das gleiche Problem und habe es mit c gelöst: \PROGRA ~1 anstelle von c: \program Dateien

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X