2010-12-03 3 views
1

Ich habe eine spezielle Notwendigkeit, Dateien in verschiedenen Unterverzeichnissen während der Ausführung meines Programms auf Os X zu finden. Ich tue dies, indem ich das Freeware-Kommandozeilen-Tool unrar anrufe, was sehr gut funktioniert. Unrar wird jedoch immer Dateien im aktuellen Arbeitsverzeichnis entpacken, was bedeutet, dass ich ein Arbeitsverzeichnis für den ausgeführten Prozess angeben muss oder jede entpackte Datei in meinem .jar-Home-Ordner ablegen muss. Das ist einfach genug, entweder mit dem processBuilder.directory (dir) oder runTime.getRuntime().exec(args,null,dir) zum Beispiel zu tun, wo dir eine Datei ist. Dies funktioniert hervorragend, aber nicht, wenn das Arbeitsverzeichnis ein Leerzeichen enthält. Als kleines Beispiel:Ausführen einer externen ausführbaren Datei in einem Arbeitsverzeichnis mit Leerzeichen in Java?

File dir=new File("/Users/chargedPeptide/rar 2"); 
String[] cmd = { "/Users/chargedPeptide/rar/unrar", "e", "-o+","/Users/chargedPeptide/rar", "2/weather.rar"}; 
Process pr = Runtime.getRuntime().exec(cmd,null,dir); 
int exitValue=pr.waitFor(); 

Wird nicht arbeiten, während mit: Process pr = Runtime.getRuntime().exec(cmd); stattdessen den Befehl erfolgreich starten, aber mich Arbeitsverzeichnis mit allen Dateien in den Gläsern lassen. Mit Process statt und unter Verwendung von p rocessbuilder.directory(dir); das Verzeichnis Ausfahrten mit der Nachricht einzustellen:

Exception: Cannot run program "/Users/chargedPeptide/rar/unrar" (in directory "/Users/chargedPeptide/rar 2"): error=2, No such file or directory 

Hilfe? Wie gehe ich mit den Räumen um? Ich habe versucht, Backslashes vor den Leerzeichen hinzuzufügen, um sie literal keine Hilfe zu machen, da das Dateiobjekt sie wie tatsächlichen Teil des Pfades behandelt.

Edit: Um die ganze Sache ein wenig klarer zu machen: 1. Ich habe eine separate Methode, die die execute-Methode einen Befehl und ein Verzeichnis zu processbuilder, alle Verzeichnisse durch die vorherige Methode gefunden und existieren. Dies funktioniert, außer wenn das Verzeichnis ein Leerzeichen enthält. 2.Ich muss das Arbeitsverzeichnis festlegen oder der Befehl wird an der falschen Stelle ausgeführt. 3.Parsing das Dateiobjekt von: dir = neue Datei (dir.tostring.replace ("", "\"); , um einen Backslash vor allen Leerzeichen zu setzen, funktioniert nicht, da das Java-Dateiobjekt dann sucht ein Pfad enthalten tatsächliche Schrägstriche kein Glück 4.Using rt.exec entweder statt Process dosen't Hilfe

Irgendwelche Ideen sehr willkommen

+0

Wenn unrar eine Erweiterung (wie .sh) hat, können Sie versuchen, sie in die cmd-Array zu setzen? – Reddy

+0

siehe auch http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=4 wenn es hilft – Reddy

+0

Vielen Dank für den Link, während ich nicht mit diesem speziellen Problem hilft Die Umleitung der Ausgabe in ein Dateibeispiel half mir mit einem separaten. unrar scheint keine Erweiterung zu haben. – chargedPeptide

Antwort

1

Wie wäre es:....

dir.mkdirs(); 

vor dem Start der Prozess

Dies erstellt das fehlende Verzeichnis.

bearbeiten:

Das sieht seltsam.

String[] cmd = { "/Users/chargedPeptide/rar/unrar", "e", "-o+","/Users/chargedPeptide/rar", "2/weather.rar"}; 

Wenn dies ein Shell war würden Sie schreiben:

unrar e -o+ "/Users/chargedPeptide/rar 2/weather.rar" 

Sie haben tatsächlich die Rar-Datei in Anführungszeichen setzen, denn sonst wird es als 2 Argumente für den Prozess interpretiert werden.

Die Art, wie Sie "cmd" teilen, wird genau das tun, brechen Sie das Rar-Argument in zwei. Versuchen Sie:

+0

Sorry, vielleicht sollte mir klar sein, das Verzeichnis existiert, in meinem eigentlichen Code ist es eingespielt durch eine andere Methode. Es scheint in diesem Fall der Speicherplatz "rar 2" zu sein, der von der Methode nicht gut behandelt wird und das Verzeichnis als nicht vorhanden angezeigt wird. – chargedPeptide

+0

Neu zu stellen Fragen über Code, also vielen Dank für Ihre Geduld. – chargedPeptide

+1

Sind Sie sicher, dass es sich um das Verzeichnis handelt, das nicht gefunden wird? 'Exception: ... Keine solche Datei oder kein solches Verzeichnis' könnte anzeigen, dass die ausführbare' unrar'-Datei nicht gefunden wurde. Existiert es a) und b) ist chmod a + x? –

0

Nicht sicher, ob es funktioniert, aber können Sie versuchen, ein/am Ende des Pfades zu setzen. , d.h.,

File dir=new File("/Users/chargedPeptide/rar 2/"); 
+0

Versuchte es, das gleiche leider ... – chargedPeptide

Verwandte Themen