# Wie auf anderen Ordner im Projektordner zugreifen?



## Angiii (2. April 2009)

Hallo,

ich habe ein Problem damit, auf die verschiedenen Unterordner meines Projektordners zuzugreifen. Das alles hat wohl auch ein bißchen mit Projektorganisation zu tun.

Ich habe einen Hauptordner "Testprojekt", der alle für mein Programm nötigen Dateien enthält. Der Ordner soll folgende 3 Unterordner enthalten:

bin -> *.class-Dateien
src -> *.java-Dateien
img -> *.bilder

Mein Problem ist, dass ich von meinen Sourcecode aus den Bilderordner "img" nicht erreichen kann. Sobald ich den "img"-Ordner jedoch in den "bin--Ordner schiebe, funktioniert es. Da ist aber eigentlich nicht die Lösing die ich haben will.

Ich habe folgende Funktion zum Aufruf des Bildes:

```
images[i] = createImageIcon("../img/Deutschland.png");
```
Diese Funktion soll ein Deutschlandflaggenbild aufrufen, welche sich im Ordner "img" des Projektordners befindet.

Hier die createImageIcon-Funktion dazu:

```
protected static ImageIcon createImageIcon(String path) {
        java.net.URL imgURL = jPanel.class.getResource(path);
       	
        if (imgURL != null) {
            return new ImageIcon(imgURL);
        } else {
            System.err.println("Couldn't find file: " + path);
                return null;
        }
    }
```
Wenn ich den "img"-Ordner in meinen "bin"-Ordner verschiebe, funktioniert der Code mit der Funktion  images[i] = createImageIcon("img/Deutschland.png");
Ich will aber nicht auf einen Unterordner von "bin"-zugreifen, sondern zuerst in den Überordner wechseln, um dann von da aus in den "img"-Ordner zu springen.

Ich habe gelesen, dass es u.a. mit der Signierung zusammenhängen kann. Im Moment arbeite ich aber noch rein in Eclipse ohne das ich irgendwelche jars exportiert habe. Da sollte es mit der Signierung noch keine Probleme geben.
Ich dachte mit "../" könnte man Überordner ansteuern? Das funktionierte bei mir nur leider nicht. Oder ist meine "createImageIcon"-Funktion einfach falsch total falsch?

Langsam kommts mir vor als wär in diesem Forum jeder zweite Frage von mir ;-).
Vielen Dank im Voraus für Eure Hilfe!


----------



## woezelmann (2. April 2009)

Hmmm, komisch, eigentlich sollte das so funktionieren.

Versuch mal bitte folgendes und sag mir, was du als Ausgabe kriegst:


```
System.out.println(new File("../img/Deutschland.png").getAbsolutePath());
```


----------



## vfl_freak (2. April 2009)

Moin,

bist Du denn sicher, dass Du Dein Projekt im "bin"-Verzeichnis startest? ? ?
Alle Pfadangaben sind nämlich relativ zu diesem Startverzeichnis! Der Verdacht liegt auch nahe, weil lt. Deiner Aussage ja "img/..." funktioniert ;-]

Gruß
Klaus


----------



## Angiii (2. April 2009)

Ok hab das mal eingegeben. Ich erhalte folgende Ausgabe:


```
P:\Eclipse Workspace\Testprojekt\..\img\Deutsch.png
```

Irgendwie hat der das"\.." voll ignoriert. Wenn ich es weglasse erhalte ich

```
P:\Eclipse Workspace\Testprojekt\img\Deutsch.png
```
An sich würde das Stimmen. Das Bild wird leider trotzdem nicht gefunden. Hat auch schon vorher erfolglos versucht, den Pfad auf diese Weise anzugeben.


----------



## vfl_freak (2. April 2009)

Moin,



Angiii hat gesagt.:


> Ok hab das mal eingegeben.
> Ich erhalte folgende Ausgabe:


Was jetzt? ? ? Etwa genau so:


> P:\Eclipse Workspace\Testprojekt\..\img\Deutsch.png


:suspekt: Das ist natürlich keine korrekte Pfadangabe! ".\" oder "..\\" sollte nur an Anfang von relativen Pfaden verwendet werden !
!


> P:\Eclipse Workspace\Testprojekt\img\Deutsch.png


Das ist der absolute Pfad? ? ?
Ich vermute wie gesagt ganz stark, dass Dein Programm in "P:\Eclipse Workspace\Testprojekt" liegt und Du somit mit "img\\Deutsch.png" drauf zugreifen kannst!

Gruß
Klaus


----------



## woezelmann (2. April 2009)

Hmmm, noch komischer ;P ... 

er scheint ja den Absoluten Pfad zur Datei zu haben. Was ich mir denken könnte ist, dass du irgendwo nen Tippfehler hast ... in deinem ersten Post war es 'Deutschland.png', in deinem Zweiten 'Deutsch.png' vielleicht liegt da der Fehler.

Axo, stürtz das Programm eigentlich ab? Gibt es in der Console irgend eine Fehlermeldung?


----------



## Angiii (2. April 2009)

woezelmann hat gesagt.:


> Hmmm, noch komischer ;P ...
> 
> er scheint ja den Absoluten Pfad zur Datei zu haben. Was ich mir denken könnte ist, dass du irgendwo nen Tippfehler hast ... in deinem ersten Post war es 'Deutschland.png', in deinem Zweiten 'Deutsch.png' vielleicht liegt da der Fehler.
> 
> Axo, stürtz das Programm eigentlich ab? Gibt es in der Console irgend eine Fehlermeldung?



Ja hab mich in dem zweiten Post verschrieben. Es bleibt natürlich bei Deutschland.png. Hatte das falsch aus dem Quellcode übernommen. Fehlermeldungen erscheinen keine. 

Ich hab jetzt mal noch etwas ausprobiert:
Ich habe den img-Ordner in den bin-Order geschoben. Wenn jetzt die Funktion " System.out.println(new File("img/Deutsch.png").getAbsolutePath());" ausführe erhalte ich folgende Ausgabe:


```
P:\Eclipse Workspace\Testprojekt\img\Deutschland.png
```

Das kann doch gar nicht sein! Der img-Ordner ist doch jetzt im bin-Ordner?! Liegt es vielleicht an meinen Eclipse-Einstellungen?
Im bin-Ordner befinden sich nur die *.class Dateien. Im Hauptordner Testprojekt befinden sich noch die *.project  und die *.classpath.


----------



## woezelmann (2. April 2009)

Also das File-Objekt repräsentiert (anders als der Name vermuten lässt) nur den Pfad zu einer Datei, nicht die Datei selbst. Es ist java also vollkommen egal, ob der Odner 'img' existiert oder nicht - er gibt dir den Pfad trotzdem aus.

ich glaub der Fehler liegt hier:


```
protected static ImageIcon createImageIcon(String path) {
        java.net.URL imgURL = jPanel.class.getResource(path);
       	
        if (imgURL != null) {
            return new ImageIcon(imgURL);
        } else {
            System.err.println("Couldn't find file: " + path);
                return null;
        }
 }
```

veruch mal so was:


```
protected static ImageIcon createImageIcon(File path) {
     return new ImageIcon(imgURL);
}
```


----------



## Angiii (2. April 2009)

woezelmann hat gesagt.:


> ```
> protected static ImageIcon createImageIcon(File path) {
> return new ImageIcon(imgURL);
> }
> ```



Was soll ich dort dann als imgURL angeben? Eclipse meckert wenn ich "java.net.URL imgURL = PanelTop.class.getResource(path);" benutze.


----------



## zeja (2. April 2009)

getResource ist dazu gedacht um sich Resourcen aus einem späteren Jar zu holen und daher nicht geeignet um auf etwas zuzugreifen was nicht im Jar liegt. Wenn du auf deinen img Ordner zugreifen willst dann nimmst du einfach:
URL imgURL = new File("img","deutsch.png").toURI().toURL();

Das ist der Weg um auf relativ zum Ausführungsverzeichnis liegende Dateien zuzgreifen.

Die Ausgabe
P:\Eclipse Workspace\Testprojekt\..\img\Deutsch.png
ist in sofern korrekt, da dies eine gültige Pfadangabe ist. Um den Pfad wirklich aufzulösen hättest du getCanonicalPath verwenden müssen.

Und: eclipse führt immer im Projektordner und nicht im bin Ordner aus. Den bin Ordner kann man sich in der Hinsicht als entpackters JAR vorstellen.


----------



## woezelmann (3. April 2009)

Sorry, war schon spät, als ich das geschrieben habe 
ich meinte das so:


```
protected static ImageIcon createImageIcon(File path) {
     return new ImageIcon(path);
}

File file = new File("../img/Deutschland.png");
ImageIcon icon = createImageIcon(file);
```

zur Erklärung:
Der Konstruktor von ImageIcon nimmt auch ein File-Objetct, und da dieses anscheinend einen korrekten absoluten Pfad zusammenbaut, kannst du es ohne über den Resource-Umweg benutzten. Um zu testen, ob es die Datei auf die das File-Objekt zeigt wirklich gibt, kannst du auch


```
file.exists();
```

prüfen.


----------



## Angiii (7. April 2009)

Hallo,

ich konnte das Problem lösen. Hauptproblem war, dass ich eine eher spärliche Projektstruktur hatte und meinte, ohne Packages auskommen zu kommen. Meine ganzer Quellcode lief über ein "Default Package". Meine Aufteilung in "src", "bin" und "img" wurde von Eclipse irgendwie nicht anerkannt.

Jetzt hab ich das Ganze sauber neu gemacht und jetzt klappts auch mit dem Zugriff. Vielen Dank für Eure Hilfe! Hat mir echt geholfen!


----------

