Ordner der Ausgeführten Datei erhalten

Hallo 🙂

ich probiere gerade den Ordner der Datei herauszubekommen, die gerade ausgeführt wird. Dazu war mein Versuch folgenes:
Java:
System.getProperty("user.dir")
Mein Problem damit ist, dass bei der Ausführung direkt innerhalb der IDE (Eclipse) ohne Export der Pfad der Datei an sich und bei der Ausführung nach dem Exportieren der Pfad des Ordners angegeben wird, in welchem sich die Datei befindet. Also:
Vor dem Exportieren:
Code:
D:\Programmierung\Eclipse Workspace\Projekt
Nach dem Exportieren:
Code:
D:\Programmierung\Eclipse Workspace

Das bedeutet, dass mein Programm in jeweils einem der Fälle nicht funktionieren würde. Gibt es eine Möglichkeit, dass man entweder nur den Pfad der Datei oder nur den Pfad des Ordners bekommt?

Grüße
Death_Vader97
 
Probier mal
Java:
        File f = new File("");
        System.out.println(f.getAbsolutePath());

bzw ändert sich wahrscheinlich auch, wenn du vorher im Projekt bist und dann nachher das Jar außerhalb exportierst und dann von außerhalb startest...

hilft dir evlt das: System.out.println(Test.class.getResource("Test.class").getPath());
bzw was willst du mit dem pfad machen?
 
Ich bräuchte den Ordner weil ich "neben" der ausgeführten Datei einen Ordner zum Speichern und Laden von Dateien haben möchte (Konfigurationsdateien, Texturen, Spielstände,...).

Wenn ich die Datei vor dem Exportieren ausführe, bekomme ich den korrekten Pfad zur Klasse. Danach bekomme ich einen "internen" Pfad, also nur innerhalb der Datei.

/D:/Programmierung/Eclipse%20Workspace/Projekt/bin/de/Death_Vader97/Projekt/Main/Main.class
de/Death_Vader97/Projekt/Main/Main.class

Dann habe ich Probiert das umzuwandeln...
Java:
new File(IO.class.getResource("IO.class").getPath()).getAbsolutePath();
Und siehe da, das Ergebnis sieht gut aus.

D:\Programmierung\Eclipse%20Workspace\Projekt\bin\de\Death_Vader97\Projekt\Main\Main.class
D:\Programmierung\Eclipse%20Workspace\de\Death_Vader97\Projekt\Main\Main.class

Es ist zwar etwas umständlich, aber da kann man ja den Pfad nachbearbeiten.
Wenn "bin" enthalten, nehme alles ab der Ebene vor "bin" weg.
Sonst nehme alles ab "de" weg.

Danke für die Hilfe! 😀
Falls noch jemand eine elegantere Lösung kennt würde ich mich noch auf eine Antwort freuen.

Grüße
Death_Vader97

Edit: Meine Lösung in Code-Form:

Java:
	public static String getJarContainingFolder(){
		String ans = "";
		@SuppressWarnings("deprecation")
		String classPath = URLDecoder.decode(new File([Classname].class.getResource("[Classname].class").getPath()).getAbsolutePath());
		String[] arr = classPath.split("\\\\");
		int binPos = -1;
		int dePos = -1;
		for (int i = 0 ; i < arr.length ; i++){
			if (arr[i].equals("bin"))
				binPos = i;
			else if (arr[i].equals("de"))
				dePos = i;
		}
		if (binPos != -1){
			for (int i = 0 ; i < binPos-1 ; i++)
				ans += arr[i]+"\\";
		} else {
			for (int i = 0 ; i < dePos ; i++)
				ans += arr[i]+"\\";
		}
		return ans;
	}
 
Zuletzt bearbeitet:
Wenn du mit "ausgeführter Datei" deine jar Datei meinst, habe ich auf StackOverflow folgendes gefunden und ein Beispiel daraus gemacht:

Java:
String jarLocation;
String separator = System.getProperty("file.separator");
try
{
	jarLocation = new File(DeineKlasse.class.getProtectionDomain().getCodeSource().getLocation().toURI().getPath()).toString();
	jarLocation = jarLocation.substring(0, jarLocation.lastIndexOf(separator) + 1);
}
catch(URISyntaxException e1)
{
	jarLocation = "ERROR";
}

Die Zeile mit den "substring" ist wichtig, sobald die Anwendung als jar exportiert wurde, da der name der jar Datei mit angegeben wird. In Eclipse ist das nicht der Fall. Hier lautet der Pfad z.B. e:\workspace\ProjektName\bin
Hier wird der substring den "bin" Teil abschneiden. Also: e:\workspace\ProjektName\


Es wird aber davor gewarnt, dass sich der Code unter bestimmter Vorraussetzung anders verhalten könnte als geplant.
"Obviously, this will do odd things if your class was loaded from a non-file location."
Ich weiss leider nicht genau wann eine Klasse mal "von einer non file location" geladen werden kann... Aber erwähnen wollte ich es der Vollständigkeit halber.

Den ausschlaggebenden Teil des Codes habe ich hier her:
StackOverflow Source
 
Also vielleicht verstehe ich das jetzt falsch, aber das ist ein klassischer Fall für relative Pfade. Angenommen du hast die Ordnerstruktur

- Projekt
-- src
-- resource

Angenommen du befindest dich im src-Ordner, dann ist der relative Pfad "../resource/".
Wie man im FileSystem navigiert (Files oder Path) oder in einer JAR (mit ClassLoader) ist oben schon genannt.
 

Zurück
Oben