# nach dem Ordner suchen, wo .jar datei sich befindet



## endidu (29. Jun 2011)

Hallo,

in meinem Programm speichere ich in einem Ordner unter  C:\Dokumente und Einstellungen\Username..  temporäre Datein. Aber wenn sich ein anderer User anmeldet, ist dieser Ordner für ihn nicht sichtbar. Oder wenn mein Programm in einem anderem Rechner läuft usw..

Also ich möchte jetzt da ein Temp-Ordner erstellen, wo sich .jar Datei meiner Applikation befindet. Also muss ich erstmal suchen, wo die .jar Datei liegt. Wie schaffe ich das? Mit File.list() kann es glaube ich lange dauern. Gibt es eine einfache Lösung? Oder bessere Ideen?

Danke im Voraus,
Grüße..


----------



## maki (29. Jun 2011)

Versuche mal

```
System.out.println(getClass().getProtectionDomain().getCodeSource().
   getLocation().toString());
```


----------



## TiME-SPLiNTER (29. Jun 2011)

Für was musst du das wissen? Du kannst ja relative Pfade nutzen. [c]File cfgDir = new File("cfg");[/c] wäre dann folgendes::


```
[File] meinejar.jar
[Dir] cfg
```


----------



## endidu (29. Jun 2011)

Danke für die blitzschnelle Antworten,



maki hat gesagt.:


> Versuche mal
> 
> ```
> System.out.println(getClass().getProtectionDomain().getCodeSource().
> ...



Diese Zeile gibt den Pfad aus, wo mein codesource/bin Ordner ligt. Durch diese Zeile 

```
new File(getClass().getProtectionDomain().getCodeSource(). getLocation().getPath(), "TempTest.log");
```
sollte nicht ein TempTest.log in dem bin-Ordner erzeugt werden?  Ich kriege es aber nicht..



> TiME-SPLiNTER



Ich entschuldige mich, aber ich habe nicht ganz verstanden, was du damit meinst..Kannst du vielleicht noch bischen mehr erklären? ich bin relativ neuling in solchen Sachen.


----------



## L-ectron-X (29. Jun 2011)

Probiere mal 
	
	
	
	





```
System.getProperty("user.dir");
```
Mehr Informationen in der Doku der Klasse [japi]System[/japi].


----------



## endidu (29. Jun 2011)

```
File f=new File(getClass().getProtectionDomain().getCodeSource().getLocation().getPath(),
"TempTest.log");
	if(!f.exists())
		try {
			f.createNewFile();
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
```
damit habe ich es gelöst..Aber ich dachte, es geht auch ohne createNewFile().. 

naja wollte jetzt fragen, ob das mein Problem so gelöst wurde.. Also wenn ich ein jar datei erzeuge, wird es auf den verschiedenen Rechner problemlos laufen? 

PS: mein Programm wird eigentlich nur unter Windows laufen.


----------



## maki (29. Jun 2011)

Probier es als Jar aus, sollte imho laufen, ausser es handelt sich um ein Managed Environment wie einen AppServer.


----------



## Gastredner (29. Jun 2011)

Beachte außerdem, dass du womöglich bei Windows Vista/7 Administratorrechte benötigst, wenn du das .jar unter C:\Program Files ablegst.


----------



## Spacerat (30. Jun 2011)

In vielen Fällen ist das Verzeichnis, in welchem sich das Jar-Archiv befindet, das aktuelle Verzeichnis. Was spricht also dagegen, diese temporären Dateien im aktuellen Pfad anzulegen?

```
File current = new File(".").getAbsoluteFile();
```


----------



## TiME-SPLiNTER (30. Jun 2011)

Spacerat hat gesagt.:


> In vielen Fällen ist das Verzeichnis, in welchem sich das Jar-Archiv befindet, das aktuelle Verzeichnis. Was spricht also dagegen, diese temporären Dateien im aktuellen Pfad anzulegen?
> 
> ```
> File current = new File(".").getAbsoluteFile();
> ```



Das hab ich in meinen Post (Nr. 3) gemeint .


----------



## maki (30. Jun 2011)

Das sog. "current directory" kann variieren, je nachdem wie die App gestartet wurde, mit meiner Methode bekommt man den Pfad zum Code/Jar, falls es die Berechtigungen zulassen.


----------



## endidu (30. Jun 2011)

TiME-SPLiNTER hat gesagt.:


> Das hab ich in meinen Post (Nr. 3) gemeint .



Danke jetzt habe ich es verstanden aber noch eine Frage? Gibt es einen Unterschied zwischen den folgenden beiden Zeilen?


```
File f = new File("Temp");
```

und


```
File f = new File(System.getProperty("user.dir") + "\\Temp");
```
die beide Zeilen erzeugen ja im codesource Ordner das Ordner "Temp".

oder wenn ich versuche, was maki vorgeschlagen hat, erzeuge ich im codesource/bin das Temp Ordner :

```
File f=new File(getClass().getProtectionDomain().getCodeSource().
				   getLocation().getPath()+"\\Temp");
```

Also welche ist sicherer? wenn alle ungefähr gleich sind, würde ich dann gerne den relativen Pfad benutzen.


----------



## mabuhay (30. Jun 2011)

Ich glaube die Diskussion gab es schon ein paar mal, und dabei ist herausgekommen das es nicht so einfach ist. Wie maki sagt, kommt es darauf an wie die .jar gestartet wurde.

z.B. die .jar liegt in /user/test/irgendwas/meine.jar

Starten aus dem Ordner /user/test/ mit java -jar irgendwas/meine.jar
gibt einen anderen Pfad zurück als
starten aus /user/test/irgendwas/ mit java -jar meine.jar

oder?

Ein paar links:
http://www.java-forum.org/java-basics-anfaenger-themen/100564-projekt-ordner-pfad-ermitteln.html
http://www.java-forum.org/java-basics-anfaenger-themen/100184-aktueller-pfad-programms-jar-ermitteln.html
http://www.java-forum.org/allgemeine-java-themen/99655-speichern-einstellungen.html

mfg


----------



## endidu (30. Jun 2011)

mabuhay hat gesagt.:


> Ich glaube die Diskussion gab es schon ein paar mal, und dabei ist herausgekommen das es nicht so einfach ist. Wie maki sagt, kommt es darauf an wie die .jar gestartet wurde.



danke schön. Ich habe die Links gereade gelesen..und sehe jetzt, dass es komplizierter ist als ich gedacht habe..

Vielleicht muss ich mal erklären, wieso ich sowas brauche.. Also in meinem Programm lese ich ständig Messwerte von einem Hardware, die temporär gespeichert werden. Ich möchte diesen Temp-Ordner so wählen, dass die .jar Datei (beim .jar erzeugen bin ich auch ganz neuling, werde aber noch lernen) meiner Applikation unter Windows auf verschieden Rechner problemlos läuft. Also Users mit verschiedenen Zugriffsrechten müssen alle Files in dem Temp-Ordner sehen können, d.h. Temp-Ordner muss für jeden sichtbar sein.  Vielleich habt Ihr andere Ideen..

mfG


----------



## mabuhay (30. Jun 2011)

Also wenn du den Temp-Ordner im gleichen Verzeichnis wie die jar-Datei haben willst, dann müssen ja alle Benutzer auch schon auf diesen Ordner mit der jar-Datei zugreifen können. Wo wäre das dann in deinem Fall? 

Du sprichst auch von einem Temporären Ordner. Heisst das, dass die Messdaten dann wieder gelöscht werden? (bei Programmende, oder wenn das System ausgeschaltet wird?)

Ich habe bemerkt, dass es in jedem Fall besser ist das Verzeichnis vom Benutzer auswählen zu lassen. Konfigurationsdateien etc sollten natürlich an den richtigen Platz (home-Verzeichnis bei linux und AppData oder wasauchimmer bei Win), aber für Daten sollte der Benutzer auswählen können. Evtl sollten die Messdaten ja auch auf ein Netzlaufwerk damit sie von anderen Benutzern gesehen werden können. Und wenn jemand das Programm benutzt ist es evtl ein kleiner Mehraufwand den Pfad anzugeben, der Pfad kann dann aber gespeichert werden. Auf jeden Fall ist das Programm dann viel flexibler.

mfg


----------



## Spacerat (30. Jun 2011)

Zusammengefasst: Das Programm liest Daten einer Hardware und soll diese für mehrere Benutzer, möglicherweise auch noch gleichzeitig zur Verfügung stellen? Also, wenn das so ist, kann das Programm bisher möglicherweise eh nur einmal gestartet werden, sofern die Hardware nicht multiinstanzfähig (z.B. COM-Ports) ist.
Ich würde mir in diesem Fall eine Server-Client-Lösung mit JDBC einfallen lassen, in welcher der Server auf die HW zugreift und seine Ergebnisse in JDBC speichert, wo diese dann von mehreren Benutzern gleichzeitig gelesen werden können. In JDBC kann man entweder seine eigene Datenbank realisieren oder auf eine bereits vorhandene zurückgreifen. Fakt bleibt auf jeden Fall, dass die einzelnen Benutzer keine Schreib-Lese-Rechte mehr auf irgendwelche Verzeichnisse benötigen.


----------



## Empire Phoenix (1. Jul 2011)

Temp werte? Hm frag doch einfach per System.getProperty() nach dem temp folder des Os, bei windos zb C:/windows/temp (je nach Version) Kann ja in dem Fall egal sein, wenns nur temporär ist und hätte den vorteil das Datenträgerbereingung ect die Daten finden würden.


----------



## endidu (1. Jul 2011)

mabuhay hat gesagt.:


> Also wenn du den Temp-Ordner im gleichen Verzeichnis wie die jar-Datei haben willst, dann müssen ja alle Benutzer auch schon auf diesen Ordner mit der jar-Datei zugreifen können. Wo wäre das dann in deinem Fall?
> 
> Du sprichst auch von einem Temporären Ordner. Heisst das, dass die Messdaten dann wieder gelöscht werden? (bei Programmende, oder wenn das System ausgeschaltet wird?)
> 
> ...



Es ist also eine grafische Oberfläche. Die Messdaten werden gelesen und aufgezeichnet. Man hat dann die Möglichkeit, die Messdaten zu speichern, um die später wieder aufzeichnen zu können.. Es kann auch durch den Benutzer selektiert werden, dass die Messdaten nach Programmende gelöscht werden. Es gibt noch ein Button, um den Temp-Ordner zu leeren. 
Und der Temp-Ordner kann durch den Benutzer sowohl durch Texteingabe als auch durch JFileChooser gewählt werden. Aber in dem Fall, dass es keinen Temp-Ordner gewählt wird, soll ein Default-Temp-Ordner automatisch gewählt werden.

Dieser Default-Temp-Ordner ist meine Frage. Aber ich lasse es jetzt einfach so, wie Empire-Phoenix beschrieben hat. Kann ich oder mit meinem .jar datei noch einen Ordner irgendwie mitliefern? 
Nochmal vielen Dank für alle Antworte.

mfG


----------

