# Dateipfad mit Backslash



## Pantoi (19. Mai 2009)

Hallo,
nachdem ich die 5 Seiten Suchergebnisse für "Dateipfad" durchgegangen
bin, bin ich zum Entschluss gekommen, dass ich entweder blind bin
oder es die Frage in der Form hier noch nicht gab ^^

Ich hab hier eine ini Datei aus der ich einige Informationen für mein Programm
bekomme. Unter anderem auch Dateipfade für ein paar .txt Dateien.
Das Problem mit den Dateipfaden ist:
Sie liegen in der Form 

Path=.\login\Admin.txt vor 

- soll heissen wenn ich
den Property-String von Path einlese, wird Java einen String in der Form:
.loginAdmin.txt speichern und diese Datei nicht öffnen können.

Ich kann den Dateipfad in dieser ini leider nicht umschreiben, d.h.
.\\login\\Admin.txt  oder ./login/Admin.txt stehen nicht zur Debatte.

Wie bringe ich meinem Programm nun bei, diese Dateipfade richtig zu interpretieren?

MfG Pantoi


----------



## Pantoi (19. Mai 2009)

Ich lese die Datei aktuell als Property, sprich getProperty("Path")


----------



## Quaxli (19. Mai 2009)

Aber erst mal liest Du ja nur einen String ein oder? Was hindert Dich daran, den String entsprechend zu "befummeln"? Z. B. alle \ durch \\ zu ersetzen und erst dann den Konstruktor Deines Files aufzurufen?


----------



## Verjigorm (19. Mai 2009)

Wenn du doch dateipfade aus der Properties-Datei einliest, hast du sie doch als Strings vorliegen und kannst Stringersetzungen vornehmen ..


----------



## Pantoi (19. Mai 2009)

bei dem String

.loginAdmin.txt

der ja nachher rauskommt, ist ja nicht mehr wirklich zu erkennen wo mal ein \
war, oder? Da wird es dann auch schwer 2 daraus zu machen...

Edit: Ich denke ich kann das Problem erst mal lösen indem ich anstatt getProperty
nen FileInputStream nehm und die Zeilen dann umbastel, mich würde aber 
dennoch interessieren ob das mit getProperty irgendwie auch geht...


----------



## Verjigorm (19. Mai 2009)

Achso, nun habe ich die Sache erst richtig verstanden.
Hm ich wüsste da so schnell keine Lösung, ausser du liest die Datei als normale Textdatei ein und parst selbst.
Oder du parst die Datei vorher und ersetzt in der Datei die / durch \


----------



## Pantoi (19. Mai 2009)

Siehe Edit  - ich denke das ist auf die schnelle mal das einfachste, anders wäre
es natürlich irgendwie angenehmer aus meinen Augen


----------



## Verjigorm (19. Mai 2009)

Die \ werden wohl als Steuerzeichen oder sowas gesehen und irgendwie unter den Tisch fallen gelassen.
Sehr merkwürdig


----------



## Pantoi (19. Mai 2009)

ich denke auch fast, das lässt sich gar nicht abfangen


----------



## faetzminator (19. Mai 2009)

wie wärs mit / statt \?
1. verwendet nur Windoof \
2. erkennt Windoof auch / statt \ (ausser evtl. bei \\host nicht)


----------



## Landei (19. Mai 2009)

Müsste sich abfangen lassen. Man kann doch beim Laden der Properties einen beliebigen InputStream angeben, und den muss man so hinbekommen, dass er die Backslashs richtig einliest.
Falls der Fehler wirklich in Properties liegt (also dort Backslashs in Strings einfach als Steuerzeichen angesehen werden), könnte man mit einem dazwischengeschalteten FilterInputStream aus jedem \ ein \\ machen, was die Sache beheben sollte.


----------



## Pantoi (19. Mai 2009)

wie gesagt: ich kann die Dateipfade leider net änder, da die so vorgegeben sind...
es greifen noch andere Programme auf die ini zu und ich geh jetzt einfach mal
davon aus, dass die mit den "\" arbeiten...
wenn ich mir die ini selbst schreiben würde wären das normal "/" und alles prima


----------



## Pantoi (19. Mai 2009)

@ Landei: wie bekomm ich den InputStream denn so hin?


----------



## Landei (19. Mai 2009)

Lies doch einfach mal die ini-Datei mit einem FileInputStream ein und gib sie auf die Konsole aus. Hat die Ausgabe die Backslashs noch oder nicht?


----------



## Pantoi (19. Mai 2009)

Also damit werden die Backslashes noch ausgegeben:

```
File file = new File(fileName);
BufferedReader d = null;
FileInputStream fis = new FileInputStream(file);
d = new BufferedReader(new InputStreamReader(fis));
while (d.ready())
{
      System.out.println(d.readLine());
}
```


----------



## Landei (19. Mai 2009)

Falls die Ausgabe die Backslashs zeigt, aber die Properties beim Laden mit demselben FileinputStream die Backslashs unterschlägt, muss ein FilterInputStream dazwischen, der die Backslashs verdoppelt.

Ungetestet:

```
properties.load(new MyFilterInputStream(derOriginaleFileInputStream));

class MyFilterInputStream extends FilterInputStream {
   final static int asciiCodeOfBackslash = 42; //zu faul zum Nachgucken...
   boolean lastWasBackslash = false;
   public MyFilterInputStream(InputStream is) { super(is); }
   @Override public int read() {
     if (lastWasBackslash) {
        lastWasBackslash = false;
        return asciiCodeOfBackslash;
     } else {
        int result = in.read();
        lastWasBackslash = result ==  asciiCodeOfBackslash;
        return result; 
     }
   }
}
```


----------



## Pantoi (19. Mai 2009)

42, n1 
ich denke aber ich hab verstanden was du meinst und werd versuchen, das gleich mal
umzusetzen, danke!


----------



## Pantoi (19. Mai 2009)

hmmm  read(); scheint beim lesen der properties nicht verwendet zu werden, d.h. wenn ich den FilterInputStream
lade, ändern sich die zeichen trotzdem nicht...


----------



## bastiann (19. Mai 2009)

Also das "Problem" oder wie man es nennen mag liegt hier:
Properties (Java 2 Platform SE v1.4.2)

Im Bereich "Load" steht der entsprechende Eintrag. "\" werden gedroppt (silent).
Um das zu verhindern würde ich die Zeile (Pfade) einlesen und mit einem regulären Ausdruck die "\" durch sogenannten File.separator ersetzen. Diese entsprechen dann je nach Betriebssystem dem entsprechenden
Trennungszeichen. Daraus kannst Du Dir dann schöne Strings mit Pfaden bauen. 

Gruß
Bastian


----------



## Landei (19. Mai 2009)

Hmm, vielleicht geht's ja so:

```
class MyFilterInputStream extends FilterInputStream {
   final static int asciiCodeOfBackslash = 42; //zu faul zum Nachgucken...
   final static int asciiCodeOfSlash = 43; //zu faul zum Nachgucken...
   public MyFilterInputStream(InputStream is) { super(is); }
   @Override public int read() {
        int result = in.read();
        return result = asciiCodeOfBackSlash ? asciiCodeOfSlash : result; 
   }
}
```


----------



## faetzminator (19. Mai 2009)

oder einfach

```
[...]
int result = super.read();
[...]
```


----------



## Pantoi (19. Mai 2009)

Hab mir jetzt nen eigenes .load geschrieben, das in der Section in der die Dateipfade stehen die \ nicht dropt... das funktioniert so weit und ich bin happy ^^
Danke für die Hilfe


----------



## bastiann (19. Mai 2009)

Jetzt musst Du nur vorsichtig sein, wenn Du Zeichen "escapen" musst.
Ich würde Dir die umständliche Variante empfehlen und über den regulären Ausdruck gehen damit Du Pfade eindeutig erkennen kannst....Nur so ein Gedanke...


----------



## Pantoi (19. Mai 2009)

das sollte in absehbarer Zeit nicht vorkommen 
aber wenn ich mal Nerv hab, kann ichs ja noch ändern


----------

