tomgk: Entfernen von . und .. in einen Dateinamen

Hallo!

Wie kann man die . und .. in einen Dateinamen korrekt entfernen wenn das Trennzeichen ein Slash ist?

MfG
tomgk

--
Selfcode=ie:% fl:( br:> va:| ls:& rl:? n4:? ss:| de:] js:| ch:? sh:) mo:) zu:(
  1. Hallo!

    Wie kann man die . und .. in einen Dateinamen korrekt entfernen wenn das Trennzeichen ein Slash ist?

    in einem Dateinamen kommen idR keine Doppelpunkte und Slashes vor, meinst Du Dateinamen + kompletter Pfadangabe?

    1. Hallo!

      in einem Dateinamen kommen idR keine Doppelpunkte und Slashes vor, meinst Du Dateinamen + kompletter Pfadangabe?

      Ich meine einen Pfadname wie z.B. "/pfad/zu/./was/../datei.f"
      Es sollen die Punkte entfernt werden sodass daraus "/pfad/zu/datei.f" wird.

      MfG
      tomgk

      --
      Selfcode=ie:% fl:( br:> va:| ls:& rl:? n4:? ss:| de:] js:| ch:? sh:) mo:) zu:(
      1. Das hat aber nicht nur mit Punkte entfernen zu tun, das .. muss auch richtig aufgelöst werden.
        Je nach Herkunft von sowas würd ich sagen, alles mit Punkten drin ist ungültig.

        1. Hi,

          Je nach Herkunft von sowas würd ich sagen, alles mit Punkten drin ist ungültig.

          komisch. Ich würde je nach Herkunft von sowas sagen, alles mit Punkten drin ist gültig.

          Cheatah

          --
          X-Self-Code: sh:( fo:} ch:~ rl:| br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
          X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
          X-Will-Answer-Email: No
          X-Please-Search-Archive-First: Absolutely Yes
          1. Ja eigentlich schon :-)
            Ich meinte nur die Umsetzung von Verzeichniswechseln würde ich nicht unbedingt zulassen, falls diese Pfade irgendwie übers Web kommen.
            Ich denke der Fragesteller wollte drauf raus wie er das auflösen kann. Aber ich würd da eher einen Versuch wittern, ins Dateisystem zu kommen.

            1. Ich meinte nur die Umsetzung von Verzeichniswechseln würde ich nicht unbedingt zulassen, falls diese Pfade irgendwie übers Web kommen.

              Ich lasse sie überhaupt nicht zu. Von einem http-konformen UA darf ich erwarten dass er Pfade normalisiert, bevor er das Web navigiert.

              Ich denke der Fragesteller wollte drauf raus wie er das auflösen kann.

              Das (http) sollte ihn gar nicht betreffen.
              Nein ich vermute, er repariert selbst definierte lokale Pfade, die er besser gar nicht relativ definiert hätte.

              mfg Beat

              --
              ><o(((°>           ><o(((°>
                 <°)))o><                     ><o(((°>o
              Der Valigator leibt diese Fische
      2. Hi!

        Ich meine einen Pfadname wie z.B. "/pfad/zu/./was/../datei.f"
        Es sollen die Punkte entfernt werden sodass daraus "/pfad/zu/datei.f" wird.

        Ich würde nachschauen, ob die zu verwendende Programmiersprache eine Funktion namens realpath() anbietet und der die Arbeit überlassen.

        Lo!

        1. Hallo!

          Ich habe versucht das Problem selbst zu lösen und folgende Java-Methode geschrieben:

          public static String makeShort(String vpathname)
          {
              StringBuilder pathBuilder=new StringBuilder(vpathname);

          int x=pathBuilder.indexOf("/./");

          while(x>=0)
              {
                  pathBuilder.delete(x, x+2);//Macht aus "/./" ein "/"
                  x=pathBuilder.indexOf("/./");
              }

          int dp=pathBuilder.indexOf("/..");
              int y;

          while(dp>=0)
              {
                  y=pathBuilder.lastIndexOf("/", dp-1);

          if(y<0)
                      throw new SecurityException("Going out of Root:"+vpathname);

          pathBuilder.delete(y, dp+3);

          dp=pathBuilder.indexOf("/..");
              }

          x=pathBuilder.indexOf("//");

          while(x>=0)
              {
                  pathBuilder.deleteCharAt(x);
                  x=pathBuilder.indexOf("//");
              }

          return pathBuilder.toString();
          }

          Funktioniert diese Methode einwandfrei oder gibt es irgendwelche Fehler?

          MfG
          tomgk

          --
          Selfcode=ie:% fl:( br:> va:| ls:& rl:? n4:? ss:| de:] js:| ch:? sh:) mo:) zu:(
          1. Gibts in Java kein replace? Damit wärst du mit dem rauswerfen von /./ schneller.
            Und ob der Rest funktioniert oder nicht, das lässt sich am besten im Debugger rausfinden. Es sieht mal nicht ganz schlecht aus, aber das reine drüberschauen wär mir viel zu unzuverlässig. Also ausprobieren, steck ein paar Eingaben rein und schau was passiert.

            Ne andere Möglichkeit wär vielleicht, den String erst mal nach allem zwischen / aufzuteilen. Dann kannst du die einzelnen Teile durchsuchen, alles was nur '.' ist rauswerfen und bei allen '..' das vorhergehende löschen. Danach setzt du es wieder zusammen. Das sieht dann vielleicht nachvollziehbarer aus als jetzt.

            1. Hallo!

              Mir gehts aber auch um die Performance. Getestet hab ich shon und es hat mit allen Teststrings funktioniert.

              MfG
              tomgk

              --
              Selfcode=ie:% fl:( br:> va:| ls:& rl:? n4:? ss:| de:] js:| ch:? sh:) mo:) zu:(
              1. Ok kvon der Performance stand ja noch nirgends was. Die hängt stark davon ab, wie Java mit Strings umgeht. Dazu weiß ich leider nichts, aber das würd ich an deiner Stelle selber mal testen, falls du verschiedene Alternativen hast.

              2. Hi!

                Mir gehts aber auch um die Performance.

                Warum nimmst du dann nicht Methoden von java.io.File? getCanonicalFile() und getCanonicalPath() bieten sich hier an.

                Lo!