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
Wenn unrar eine Erweiterung (wie .sh) hat, können Sie versuchen, sie in die cmd-Array zu setzen? – Reddy
siehe auch http://www.javaworld.com/javaworld/jw-12-2000/jw-1229-traps.html?page=4 wenn es hilft – Reddy
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