# File: relativen Pfad setzten



## Saskia21 (19. März 2008)

Hi Leute

Ich erzeuge in einer Klasse ein File und will es an eine bestimmte Stelle speichern.

```
File out = new File("D:/Workspace/Projektname/WebContent/WEB-INF/data/"+timeStampZIP+".zip");
```
ich will das aber als relativen Pfad angeben -> weiß jemand wie das geht?


----------



## Matze (19. März 2008)

Wo liegt das Problem?
Der Pfad wird als String übergeben. Einen String kann man doch nach belieben verändern.
Wenns dir hilft, hast du dir schonmal den JFileChooser angesehen?


----------



## Saskia21 (19. März 2008)

HI
Ja habe ich, nur ha man den keine Möglichkeit einen relativen Pfad anzugeben? 
.../data/Date.zip oder so?


----------



## Matze (19. März 2008)

probiers doch mal aus ^^.
Bin mir nicht sicher, aber ich denke schon dass das geht.


----------



## MeinerEiner_80 (19. März 2008)

Moin!
Relativ zu welchem Pfad ist hier die Frage. Arbeitsverzeichnis? Home Verzeichnis?
Schau dir mal das hier an: http://java.sun.com/javase/6/docs/api/java/lang/System.html#getProperties()
mit manchen der Properties kannst du dir dann Pfade zusammenbauen..

*grüssle*
MeinerEiner


----------



## Saskia21 (19. März 2008)

ich hatte es dann so probiert:
new File("../Projektname/WebContent/WEB-INF/data/dateiname.zip");
aber es wird immer eine Exception geworfen, dass der Path nicht gefunden werden kann.
Weiß jemand Rat?

-> realtiv zum Projekt, da ich ja die Datei in einem Ordner in meinem Projekt speichern will


----------



## Oliver Gierke (19. März 2008)

Soweit ich weiß , ist das Workingdirectory der VM dein Projektverzeichnis (zumindest, wenn du die ANwendung aus Eclipse heraus startest). D.h. 
	
	
	



```
new File("WebContent/WEB-INF/data/dateiname.zip");
```
 sollte funktionieren.

Gruß Ollie


----------



## Saskia21 (19. März 2008)

Hi Oliver^^

nein der Workspace ist nicht in Eclipse. Liegen zwar beide unter D: aber sind in 2 unt. Ordnern


----------



## zerix (19. März 2008)

Hallo,

das ist nicht nur in eclipse so. Die VM geht immer von dem Ordner aus, in dem sich das Programm befinden.

Beispiel

Programm befindet sich in 

```
C:\MeinProgramm
```

Dann gibts noch einen Ordner

```
C:\MeinProgramm\resources
```

Dann kannst du einfach den Pfad

```
new File("resources/dateiname.zip");
```
nutzen.

MFG 
Sascha


----------



## Saskia21 (19. März 2008)

HI

Ja klar versteh ich auch, aber leider funktioniert es nicht und ich kann nicht mit absoluten Pfaden arbeiten, wenn also jemand noch eine andere Lösung parat meld wäre das echt klasse.


----------



## zerix (19. März 2008)

Wird eine Exception geworfen?
Wenn ja, poste die bitte mal mit dem kompletten Stacktrace.

Und poste mal bitte die Ausgabe von

```
System.out.println(new File(".").getAbsolutePath());
```

MFG

Sascha


----------



## Saskia21 (19. März 2008)

die Fehlermeldung:

```
java.io.FileNotFoundException: WebContent\WEB-INF\data\200803191511.zip (Das System kann den angegebenen Pfad nicht finden)
	at java.io.FileOutputStream.open(Native Method)
	at java.io.FileOutputStream.<init>(Unknown Source)
	at java.io.FileOutputStream.<init>(Unknown Source)
	at sd.services.server.Zipper.zip(Zipper.java:19)
	at sd.services.server.ZipGenerator.createZip(ZipGenerator.java:157)
	at sd.functions.rich.RichAction.execute(RichAction.java:65)
	at sd.functions.base.AbstractBaseAction.execute(AbstractBaseAction.java:197)
	at org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:425)
	at org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:228)
	at sd.struts.RequestProcessor.process(RequestProcessor.java:148)
	at org.apache.struts.action.ActionServlet.process(ActionServlet.java:1913)
	at org.apache.struts.action.ActionServlet.doGet(ActionServlet.java:449)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:690)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:803)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
	at org.displaytag.filter.ResponseOverrideFilter.doFilter(ResponseOverrideFilter.java:125)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
	at sd.struts.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:70)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:215)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:213)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:433)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:174)
	at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:874)
	at org.apache.coyote.http11.Http11BaseProtocol$Http11ConnectionHandler.processConnection(Http11BaseProtocol.java:665)
	at org.apache.tomcat.util.net.PoolTcpEndpoint.processSocket(PoolTcpEndpoint.java:528)
	at org.apache.tomcat.util.net.LeaderFollowerWorkerThread.runIt(LeaderFollowerWorkerThread.java:81)
	at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:689)
	at java.lang.Thread.run(Unknown Source)
```
und die Ausgabe:

```
D:\Tools\eclipse\.
```


----------



## zerix (19. März 2008)

Jetzt hätte ich gerne noch ein Paar Infos.

In welchem Ordner befindet sich dein Programm. 
Ich schätze mal der Ordner eclipse ist der Programm-Ordner von eclipse, oder?

Sieht so aus, als würde es sich um eine Web-applikation handeln, oder?

Ich schätze, dass der Class-Path in einer Config-Datei neu gesetzt wird.

MFG

Sascha


----------



## quidnovi (26. August 2012)

Hi @ all 

ich grabe diesen Thread mal aus, weil sich mir dasselbe Problem stellt und ich leider noch keine Lösung habe.

Also, folgendes:
Ein JFileChooser wird als runnable jar gestartet.
Es wird ein Image von irgendeinem Ordner des Anwenders in einen Ordner der Anwendung kopiert.

mit dem absoluten Pfad funktioniert das wohl:

```
cb.copyFile(new File(FPATH), new File("R://JAVA//EclipseEEWorkspace//projekt//src//at//components//images//image." + fn.extension()));
```

Wie aber oben schon erwähnt, ist das ein runnable jar, was bedeutet, dass diese auch zB. von einem USB - Stick aus gestartet werden kann, mit anderen Worten, dieses Programm wird nirgendwo installiert.

Der Dreh - und Angelpunkt ist , dass statt

```
R://JAVA//EclipseEEWorkspace....
```
die Pfadangabe des Zielordners der Anwendung angegeben ist.

Wenn ich nun die Pfadangabe wie folgt abändere:

```
cb.copyFile(new File(FPATH), new File("//projekt//src//at//components//images//image." + fn.extension()));
```
kommt eine

```
java.io.FileNotFoundException: \projekt\src\at\components\images\image.gif (Der Netzwerkpfad wurde nicht gefunden)...und so weiter
```

Denke aber doch, dass eine relative Zielordnerangabe möglich ist...odel bin ich da irriger Anschauung?

Ich würde Euch nun um Hilfe bitten...vielen Dank im Voraus


----------



## I2oxxi (26. August 2012)

naja, man kann auch einfach "drumherum" denken und den pfad der aktuellen datei ermitten und damit weiterarbeiten, wenn ich das hier richtig verstehe 

```
public static void main(String[] args){
		String path = System.getProperty("user.dir");
		System.out.println(path);
		//erweitere diesen path, unterordner anhängen etc
	}
```


----------



## quidnovi (26. August 2012)

IT WORKS!

Spitze...vielen Dank!

Habe den Pfad erweitert und das Bild wird genau in den dafür vorgesehenen Ordner abgespeichert 

Der Code schaut jetzt folgendermaßen aus:

```
String path = System.getProperty("user.dir");
String path2 = "//src//at//components//images//image.";
cb.copyFile(new File(FPATH), new File(path + path2 + fn.extension()));
```

Danke nochmals


----------



## Jungspund (28. August 2012)

anosonsten funktioniert auch

```
String relativ = new File(".").getCanonicalPath();
File absolout = new File(relativ +"\\Ordner");
```


----------



## quidnovi (24. Juni 2013)

So...nun muss ich an dem oben genannten Problem weiterarbeiten, weswegen dieser Thread nochmals bemüht wird 

Ich habe das nun von Jungspund umgesetzt.
Das funktioniert.

Ein gewähltes Bild wird von einem Ordner auf meiner Festplatte in den Workspace von Eclipse kopiert.
Starte ich den Windows - Explorer und rufe den betreffenden Ordner auf, so finde ich das kopierte Bild - aber nur dort.

In der Eclipse selbst, im scr Pfad, scheint das Bild nicht auf, weswegen ich auch nicht zugreifen kann.
Selbst wenn ich die Eclipse neu starte, erscheint das Bild nicht.

Wieso ist das so?

Bitte Euch um eine Erkläre, danke 
quidnovi


----------



## diel2001 (24. Juni 2013)

Vielleicht wird die Dateiendung herausgefiltert?
Oder du musst ein Refresh auf das Projekt machen.


----------



## quidnovi (24. Juni 2013)

Hi diel2001 

Die Dateieindung wird nicht herausgefiltert, das Bild wird unter seinem Namen und Endung im vorgesehenen Ordner gespeichert.
Refresh auf das Projekt bringt leider auch nix 

Jetzt mal 'ne grundsätzliche Frage:
Ist es richtig, wenn die Images unterhalb des src - Baumes gespeichert werden?
Oder ist es besser diese direkt unterhalb des Projektes zu sammeln?

Bis jetzt habe ich die benötigten Images unterhalb der src in unterschiedliche Ordner gespeichert.
Also: src/imgOrdner/ usw.
Diese habe ich allerdings per Mausklick in diese Ordner kopiert.
Das soll nun auch mit dem JFileChooser funktionieren, was ja auch funktioniert - eigentlich...
Dass die über diesen Chooser kopierten Images im Windows - Explorer sichtbar sind, in Eclipse aber nicht, verstehe ich nicht. 

Das definierte Ziel:
Es handelt sich um eine Applikation.
Während der Laufzeit dieser Applikation muss man Bilder von einer Partition/Festplatte in die Applikation speichern können.
Diese Bilder sollen dann aus der Applikation heraus angezeigt werden können.

Wie oben geschrieben...per Maus in die jeweiligen Ordner kopierte Images kann ich ohne Probleme aufrufen,
jene mit dem FileChooser sind nicht mal sichtbar 

Issn da los?
quidnovi


----------



## quidnovi (24. Juni 2013)

Halt! Alles retour!

Offenbar habe ich mich beim Refresh vertippt, denn es funktioniert!
Spitze, ist ja fast schon die Lösung 

Jetzt werde ich mal nach einem Code googeln, der das automatisch nach dem Kopieren durchführt 

Melde mich wieder


----------



## quidnovi (24. Juni 2013)

Beim Durchforsten des Inet's stellte sich mir folgende Frage:

Der refresh des Ordners, in welchem das neu kopierte Image gespeichert wurde, ist doch wohl nur für Eclipse notwendig, oder?
Habe nun das Häkchen bei automatischen refresh in den Einstellungen gesetzt, worauf ich nach kurzer Zeit auch dem kopierten Bild angesichtig wurde.

Wenn die Applikation fertig ist, also eine jar oder exe draraus gemacht wurde, hat das ja keine Bedeutung mehr, oder?
Mit anderen Worten, da das Bild ja richtig verspeichert wird, ist im laufenden Betrieb dieses ja abrufbar...oder bin jetzt da irriger Anschauung?

Da mein Java noch recht dürftig ist und diese Applikation die erste ist, welche ich selbst erstelle, verfüge ich leider noch nicht über dieses Basiswissen, doch ist es für mich sehr beruhigend zu wissen, dass das obig beschriebene genauso funktioniert.

Ich bitte Euch nur noch um diesen Input, danke 
quidnovi


----------



## Writtscher (25. Juni 2013)

Ich arbeite mit Idea und dort ist es so: Idea arbeitet komplett auf den Files und Ordnern, die du angibst. Änderst du was im Explorer bekommt Idea da sofort mit. Bei Eclipse ist das anders, Eclipse arbeitet meines Wissens nach auf einem eigenem Abbild deines Ordners und der Files. Änderst du nun was im Ordner (also Windows Explorer) und nicht in Eclipse bekommt das Eclipse erstmal nicht mit. Du musst explizit refreshen!

Um dich zu beruhigen: Das ist nur IDE Problem, deine Anwendung funktioniert aber, wie ich oben gelesen habe, einwandfrei.

Edit: Ich denke nicht, dass du später zur Laufzeit Bilder in ein Jar File kopieren kannst. Ich denke du wirst einen externen Ordner, auf den deine Anwendung zugreift, brauchen und dort deine hochgeladenen Bilder abspeichern. Mit anderen Worten: Zurzeit speicherst du Bilder in src/... Dieser Ordner wird später kompiliert. An diesem Ordner wirst du nach dem kompilieren und dem erstellen deines Jars nichts mehr ändern können bzw. wollen.


----------



## quidnovi (25. Juni 2013)

Hi Writtscher 

vielen Dank für Deine Auskünfte, beruhigen mich.
Dachte mir das bereits 

Allerdings macht mir das mit den Bildern doch ein wenig Kopfzerbrechen.
Eigentlich die Tatsache, dass ich nach kompilieren des Ganzen, nichts mher hinzufügen kann.
Nun ist das bei den Bildern keine große Sache, dann referenziere ich eben das Bild.
Wenn's denn aus dem betreffenden Ordner gelöscht wird, gibt es eben keines mehr.

Das was mir allerdings Sorgen bereitet ist die integrierte H2 - Db.
Verhält es sich da gleich? Kann man während der Laufzeit nichts mehr in diese Db hineinschreiben?
Ich hoffe doch nicht...
Da ich bis jetzt nur mit online Datenbanken gearbeitet habe, fehlt mir dieses Wissen. 

Das ist elementar, da ich dann einen komplett anderen Weg finden muss, ist das Hinzufügen von Daten in diese Db, doch ein Herzstück des Ganzen ist.

Danke im Voraus für die Info 
quidnovi


----------



## Writtscher (25. Juni 2013)

Hallo, das mit der H2 Datenbank ist kein Problem und funktioniert trotzdem weiterhin.


----------



## quidnovi (25. Juni 2013)

Ja spitze 

vielen Dank


----------

