# filelocator absolutepath



## noisebreath (1. Jul 2009)

Hi,

ich hab mit diesem Code versucht den filelocator zu benutzen:


```
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;
import java.util.Properties;

import org.eclipse.core.runtime.FileLocator;
import org.eclipse.core.runtime.Path;
import org.eclipse.core.runtime.Platform;
import org.osgi.framework.Bundle;


	/**get text2onto.properties location*/
	static Bundle bundle = Platform.getBundle("text2Onto");
	static Path path = new Path("ressource/text2onto.properties");
	static URL fileURL = FileLocator.find(bundle, path, null);
	static String a = fileURL.toString();
	System.out.println(a);
```

Die Ausgabe ist : bundleentry://747/ressource/text2onto.properties

auch "static String a = fileURL.getPath().toString();"  gibt mir nur die ausgabe :

/ressource/text2onto.properties

Ich brauch aber den absoluten Pfad.. kann mir einer sagen wie ich an den komme?

lg
noise


----------



## noisebreath (1. Jul 2009)

bin ich im falschen thread? eher plattformprogrammierung? :-/


----------



## Tobias (1. Jul 2009)

wahrscheinlich. Allerdings könnte ich mir durchaus vorstellen, dass es keinen absoluten Pfad gibt, weil deine Datei innerhalb eines JARs liegt und die Ordnerhierachie dort eben mit "/resources" startet. Ist aber nur eine Vermutung.


----------



## noisebreath (1. Jul 2009)

es muss doch möglich sein den pfad des bundles zu bekommen z.b: C:\workspace\plugin\ressource etc...
 oder nicht?


----------



## Michael... (1. Jul 2009)

Versuchs über getResource(). Eventuell so:

```
System.out.println(bundle.getClass().getResource("ressource/text2onto.properties"));
```
oder so:

```
System.out.println(bundle.getClass().getResource("/ressource/text2onto.properties"));
```


----------



## Chumax (1. Jul 2009)

```
String path = new File("ressource/text2onto.properties").getAbsolutePath();
```

Bin mir aber nicht sicher, ob es das ist was du suchst.


----------



## noisebreath (1. Jul 2009)

ne ich denke nicht. wenns geht sollte denke ich jetzt doch jemand diesen post ins plattformprogrammierungsthread schieben.. denke nicht dass es hierher gehört.


auch wenn ich versuche statt einen String die URL vom Code oben zu übergeben und über die uri ein file zu erzeugen geht das nicht:

```
public static void load( URL fileURL) throws IOException, FileNotFoundException {
		System.out.println( "loading settings from file " + sFile );
		try {
			m_properties.load( new FileInputStream( new File( fileURL.toURI() ) ) );
		} catch (URISyntaxException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
```

bin da jetzt ein wenig überfragt er schmeisst dann natürlich:
"java.lang.IllegalArgumentException: URI scheme is not "file""

klare sache er hat ja nur die /ressource/text2onto.properties dadurch....


----------



## Wildcard (1. Jul 2009)

Das kann nicht funktionieren. Dateien die in ein Jar verpackt wurden sind keine Dateien mehr, sondern jar entries. Die File API lässt sich aber, wie der Name schon sagt, nur auf Dateien anwenden.
Glücklicherweise ist die Java API allerdings flexibel genug um praktisch überall mit InputStreams zu arbeiten, du brauchst also kein File Handle


----------



## noisebreath (2. Jul 2009)

???
das ist kein jar und hat in meinen augen auch nichts mit nem jar zu tun.
das ist ein plugin, und innerhalb dieses plugins will ich einen FileInputStream auf ein File setzen, dass sich im unterordner ressource vom Plugin selber befindet. 
Ich dachte genau dafür wäre FileLocator ?

lg
noise


----------



## Michael... (2. Jul 2009)

In der Regel liegen Plugins (zumindes die, die ich kenne) als jar-Archiv vor.
Deswegen auch meine Anmerkung es mal mit getResource() zu versuchen.


----------



## noisebreath (2. Jul 2009)

also um da sproblem nochmal genau zu beschreiben. Ich hab ein file x aus dem ich lesen will. dieses file ist in einem Ordner ressource welches innerhalb meines Plugins liegt. Plugin liegt in Workspace und aus dem Src code des plugins will ich auf dieses file zugreifen. ich will den pfad relativ halten, dass falls jemand die platform bei sich zu hause aufsetzt um dran weiter zu programmieren nicht die pfade neu angepasst werden muessen (sein workspace kann ja sonstwo sein). Nun hatte man mier hier vor einiger zeit den filelocator vorgeschlagen. Das habe ich wie oben benutzt aber der locator kriegt wohl das file nicht so wie ich es erwartet habe. der pfad ist nicht erkennbar.. bzw schauts so aus, als ob es immer relativ zum bundle ist. das wäre auch nicht tragisch wenn mir jemand sagen könnte wie ich darüber einen stream aufs file machen kann.

lg
noise


----------



## noisebreath (2. Jul 2009)

also ich hab das jetzt wie vorgeschlagen mit dem Inputstream die sache gelöst:


```
Bundle bundle = Platform.getBundle(yourPluginId);
   Path path = new Path("icons/sample.gif");
   URL fileURL = FileLocator.find(bundle, path, null);
   InputStream in = fileURL.openStream();

		try {
			m_properties.load( in );
		} catch (URISyntaxException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
```
Hab den code grad so noch nicht ausprobiert, aber das sollte ja klappen


----------



## Wildcard (2. Jul 2009)

Gleich angewöhnen: nur mit InputStreams arbeiten (wenn es um programminterne Resourcen geht).
Schön das es jetzt funktioniert...


----------



## noisebreath (5. Jul 2009)

Oki ich werds mir merken. das ist aber ein tool dass ich zu nem plugin gemacht hab, hab daher nicht die freiheiten auch jeden code zu ändern, weil das programm auch auf einige apis (jars) zugreift. daher die frage: ist es möglich mit dem filelocator irgendwie ein file zu erzeugen. also was ich damit meine ist, dass das programm auf eine funktion einer api zugreift die als parameter ein file übergeben bekommt ( function (new file("filepath")) und ich würde gerne verhindern, dass jeder der diese plattform bei sich zu hause aufsetzt diesen pfad explizit angeben muss. bisher sehe ich aber keine möglichkeit dazu, weil ich noch keine möglichkeit gefunden habe den absoluten pfad mit dem filelocator heraus zu kriegen. irgendwelche vorschläge?

lg noise


----------



## Wildcard (5. Jul 2009)

Das Plugin wird als jar Deployed, das Jar selbst ist eine Datei, der Inhalt nicht, also greift auch die File API nicht. Die ist nämlich, wie der Name schon sagt, für Dateien geschrieben worden.


----------

