Probleme bei Verwendung von Pfad mit #-Zeichen

MadMax2581

Mitglied
Hallo Zusammen,

hab mal wieder ein Problem was mir nicht recht erklären bzw. nicht lösen kann.

Ich habe ein kleines Java-Programm geschrieben das von der Konsole mehrere Angaben von der Ablage von Files erhält.

Aufruf: Metric.exe ../temp/test.ini ../temp/test.map test
__________|_________|__________|________|________________
____Aufruf Exefile_relativer Pfad_relativer Pfad_Name Outputfile
_____________und Name Inifile_und Name Mapfile

Das Tool wird innerhalb eines Projekts (Projektordner mit vielen Unterordnern mit Files) verwendet und die Exe ist auch in einem dieser Unterordner abgelegt.

Zum verarbeiten des Inifiles verwende ich das Paket --> org.apache.commons.configuration.INIConfiguration bzw. nur das Pakket org.apache.commons (ist ein Jarfile das mit in die Exe aufgenommen ist) , keine Ahnung ob das was zu sagen hat. Benutze ja auch sonst noch mehrere externe Jars (wie z.B. JDOM, ...).

Wenn ich einen normalen Projektnamen habe (P_c344_potter~P_c344_potter_mod) funktioniert alles einwandfrei. Wenn ich ablagebedingt ein #-Zeichen im Projektnamen habe (WUP#P_c344_potter~P_c344_potter_mod) dann funktioniert nichts mehr.
Dann schneidet er mir alles nach dem # ab, weil er es als Kommentar erkennt (oder so ähnlich). Dadurch findet er dann die Datei nicht mehr und wirft den Fehler:

org.apache.commons.configuration.ConfigurationException: C:\System\Test\T_mlight~grimmma_i\T_mlight\..\..\..\..\..\WUP (Das System kann die angegebene Datei nicht finden)
at org.apache.commons.configuration.AbstractFileConfiguration.load(AbstractFileConfiguration.java:293)
at org.apache.commons.configuration.AbstractFileConfiguration.load(AbstractFileConfiguration.java:217)
at org.apache.commons.configuration.AbstractFileConfiguration.load(AbstractFileConfiguration.java:195)
at org.apache.commons.configuration.AbstractFileConfiguration.<init>(AbstractFileConfiguration.java:140)
at org.apache.commons.configuration.INIConfiguration.<init>(INIConfiguration.java:198)
at read_files.ReadIniFile.Split(ReadIniFile.java:42)
at main.ProgramFlow.Workflow(ProgramFlow.java:72)
at main.MainApp.main(MainApp.java:20)
Caused by: java.io.FileNotFoundException: C:\System\Test\T_mlight~grimmma_i\T_mlight~grimmma_i\T_mlight\..\..\..\..\..\WUP (Das System kann die angegebene Datei nicht finden)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(Unknown Source)
at java.io.FileInputStream.<init>(Unknown Source)
at sun.net.http://www.protocol.file.FileURLConnection.connect(Unknown Source)
at sun.net.http://www.protocol.file.FileURLConnection.getInputStream(Unknown Source)
at java.net.URL.openStream(Unknown Source)
at org.apache.commons.configuration.AbstractFileConfiguration.load(AbstractFileConfiguration.java:284)
... 7 more

Könnte das Problem mit Java zusammenhängen, oder mit einem eingebundenen Jarfile? Hatte so ein Problem schon mal jemanden und wie könnte man es umgehen?

Schon mal danke für Eure Hilfe.

Gruss
Max
 
Zuletzt bearbeitet:
Danke für die Hilfe, bringt aber leider nichts.

Das Problem ist das alle meine Pfade relativ sind und das #-Zeichen da auch nicht vorkommt, sondern erst ausserhalb des Projektes wo mein Programm eingesetzt wird. Sprich: intern vervollständigt er die relativen Pfade zu absoluten Pfaden und dabei kommt dann das #-Zeichen in einem Ordner weiter aussen zum tragen. Bei der internen Weiterverarbeitung schneidet er dann beim verarbeiten ab, kann den Pfad auch intern nicht bearbeiten -> der Sinn wäre dann weg, weil er den andere Pfad ja nicht kennt..

Kannst es gern einfach mal probieren: Leg dir einfach irgendwo nen Ordner an und baue in den Namen eine Raute ein. Dann lass dir einfach in einem Java-Programm den Pfad geben und du wirst sehen das er dir auch nur den Pfad bis zum Zeichen vor der Raute zurück gibt. Das #-Zeichen wird bei mehreren Sprachen als Kommentar angesehen und dann nicht mehr interpretiert..

Kann man irgendwie verhindern das er das macht? Jemand eine Idee?

Gruss
Max
 
Mach dir mal eine neue INIConfiguration und schreib da etwas mit # rein und speicher das ganze. Dann sollte er das escapen und korrekt wieder einlesen können oder?
 
Kannst es gern einfach mal probieren: Leg dir einfach irgendwo nen Ordner an und baue in den Namen eine Raute ein. Dann lass dir einfach in einem Java-Programm den Pfad geben und du wirst sehen das er dir auch nur den Pfad bis zum Zeichen vor der Raute zurück gibt. Das #-Zeichen wird bei mehreren Sprachen als Kommentar angesehen und dann nicht mehr interpretiert..

Kann man irgendwie verhindern das er das macht? Jemand eine Idee?

Gruss
Max

hab ich gemacht...
mhhh...funktioniert tadellos.

hab nen ordner erstellt, mit folgender Bezeichnung:
11##22##33#44#55#66##
Den habe ich dann mitm FileChooser ausgewählt.
(der bequemlichkeit wegen...)

Code:
JFileChooser fc = new JFileChooser();
fc.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
if (fc.showOpenDialog(null) == JFileChooser.APPROVE_OPTION)
{
    File f = fc.getSelectedFile();
    System.out.println(f.getAbsolutePath());
}

ich denke, was das OS an Bezeichnungen für z.B Dateien/Ordner (Windows) unterstützt, wird auch von Java unterstützt.
 
Danke für eure Antworten, aber geht nicht!

@benhaze: das es damit funktioniert ist klar, aber probiers mal damit:

import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.configuration.INIConfiguration;

INIConfiguration linic_metadata = new INIConfiguration("../324#sdf#sdf/P_c344_pot.ini");

Dann schneidet er dir auch alles ab der Raute weg.


@zeja: deins hab ich nicht ganz verstanden, wie meinst du das -> schreib da etwas mit # rein und speicher das ganze? Sobald ich was mit #-Zeichen laden will bekommt er ne Exception.

Gruss
Max
 
Danke für eure Antworten, aber geht nicht!

@benhaze: das es damit funktioniert ist klar, aber probiers mal damit:

Max

naja, wenn es doch KLAR ist, dann mach es doch genauso wie der filechooser...
außerdem hast du die raute gar nicht *escaped*.....

evtl. musste sowas schreiben wie
INIConfiguration linic_metadata = new INIConfiguration("../324\#sdf\#sdf/P_c344_pot.ini");
 
Eben das ist ja das Problem. Ich arbeite im Programm mit relativen Pfaden (so wie das eben sein muss -> wenn ich es unabhängig verwenden will), da kommt das blöde #-Zeichen auch nicht vor.

Das INIConfiguration bricht das dann aber wieder auf absolute Adressen um und dabei kommt dann das #-Zeichen ins Spiel. Da komme ich dann natürlich nicht mehr ran und kann es auch nicht mehr *escapen*. Dadurch wird der Pfad dann beim Aufruf von INIConfiguration ... abgeschnitten und ich bekomme eine Exception. Den filechooser nachbilden will ich nicht, da das INIConfiguration sehr gut arbeitet und ich es an mehreren Stellen benutze. Ich kann mir auch nicht vorstellen das es an dem INIConfiguration-jar liegt, ist ja doch weit verbreitet.

Das *escapen* hatte ich übrigens lokal auch so wie du probiert, funktioniert aber bei Java mit dem #-Zeichen nicht.

Gruss
Max
 
Das *escapen* hatte ich übrigens lokal auch so wie du probiert, funktioniert aber bei Java mit dem #-Zeichen nicht.
Max

zugegeben, es war reine Spekulation das Zeichen zu *escapen*

wie dem auch sei....

aber nachvollziehen bzw. reproduzieren kann ich dein Problem nicht..
Kannst du nicht etwas mehr Code posten, damit wir (oder ich) es testen können?

der ctor von INIConfiguration erwartet entweder nen String, nen File oder ne URL...
da muss doch was zu machen sein....

wie isses mit file://../b#l#a/b#la/bl#a ?

oder erstell nen File Objekt und übergib dieses...
Code:
File f = new File("c:/flfl#fl/kfk#fkf");
if (f.exists())
{
   new INIConfiguration(f);
}
 
Zurück