Ändern des aktuellen Arbeitsverzeichnisses in Java?



Answers

Wenn Sie Ihr Legacy-Programm mit ProcessBuilder ausführen, können Sie sein Arbeitsverzeichnis angeben.

Question

Wie kann ich das aktuelle Arbeitsverzeichnis innerhalb eines Java-Programms ändern? Alles, was ich über das Thema herausgefunden habe, behauptet, dass man es einfach nicht kann, aber ich kann nicht glauben, dass das wirklich der Fall ist.

Ich habe einen Code, der eine Datei unter Verwendung eines fest codierten relativen Dateipfads aus dem Verzeichnis öffnet, in dem er normalerweise gestartet wurde, und ich möchte diesen Code nur in einem anderen Java-Programm verwenden können, ohne ihn von innen starten zu müssen ein bestimmtes Verzeichnis. Es scheint, als ob Sie nur System.setProperty( "user.dir", "/path/to/dir" ) aufrufen System.setProperty( "user.dir", "/path/to/dir" ) , aber soweit ich das herausfinden kann, schlägt der Aufruf dieser Zeile im Stillen fehl und tut nichts.

Ich würde verstehen, wenn Java Ihnen das nicht erlauben würde, wenn Sie nicht das aktuelle Arbeitsverzeichnis erhalten und sogar Dateien mit relativen Dateipfaden öffnen könnten.




Die schlauere / einfachere Sache hier ist, nur Ihren Code zu ändern, so dass die Datei nicht geöffnet wird, vorausgesetzt, dass sie im aktuellen Arbeitsverzeichnis existiert (ich nehme an, Sie machen etwas wie new File("blah.txt") den Pfad zur Datei selbst.

Lassen Sie den Benutzer das Basisverzeichnis weitergeben, lesen Sie es aus einer Konfigurationsdatei, greifen Sie zurück auf user.dir wenn die anderen Eigenschaften nicht gefunden werden, usw. Aber es ist viel einfacher, die Logik in Ihrem Programm zu verbessern, als es ist um zu ändern, wie Umgebungsvariablen arbeiten.




Wenn Sie Ihre Befehle in einer Shell ausführen, können Sie etwas wie "java -cp" schreiben und alle Verzeichnisse hinzufügen, die durch ":" getrennt werden sollen. Wenn Java nicht in einem Verzeichnis gefunden wird, versuchen Sie es in den anderen Verzeichnissen ist was ich tue.




Sie können verwenden

neue Datei ("relative / path"). getAbsoluteFile ()

nach

System.setProperty ("user.dir", "/ einige / Verzeichnis")

System.setProperty("user.dir", "C:/OtherProject");
File file = new File("data/data.csv").getAbsoluteFile();
System.out.println(file.getPath());

Wird gedruckt

C:\OtherProject\data\data.csv



Wie bereits erwähnt, können Sie die CWD der JVM nicht ändern, aber wenn Sie einen anderen Prozess mit Runtime.exec () starten, können Sie die überladene Methode verwenden, mit der Sie das Arbeitsverzeichnis angeben können. Dies ist nicht wirklich zum Ausführen Ihres Java-Programms in einem anderen Verzeichnis, aber in vielen Fällen, wenn Sie ein anderes Programm wie zum Beispiel ein Perl-Skript starten müssen, können Sie das Arbeitsverzeichnis dieses Skripts angeben, während das Arbeitsverzeichnis der JVM unverändert bleibt.

Siehe Runtime.exec javadocs

Speziell,

public Process exec(String[] cmdarray,String[] envp, File dir) throws IOException

dir ist das Arbeitsverzeichnis, in dem der Subprozess ausgeführt werden soll




Es ist möglich, das PWD zu ändern, indem JNA / JNI verwendet wird, um Aufrufe von libc durchzuführen. Die JRuby-Leute haben eine handliche Java-Bibliothek, um POSIX-Aufrufe namens jna-posix Hier ist die Maven-Info

Sie können hier ein Beispiel seiner Verwendung here (Clojure Code, sorry). Sehen Sie sich die Funktion chdirToRoot an






Links