Frank: Anzeigen des Pfades

Hallo !
Ich habe in Perl eine kleine Suchmaschine gebaut.
Ich kann einen beliebigen Pfad auf meinem Rechner angeben und mir werden alle darunterliegenden Verzeichnisse angezeigt. Leider aber ohne die Pfadangabe.
Beispiel:
r:\windows\system\test
wird als
test ausgegeben.
Wie kann ich erreichen, daß der Pfad mit angegeben wird ?
Ich habe mal dieses pwd ausprobiert. Aber das hat nicht geklappt.
Wenn ich die Suchergebnisse in ein Array pushe, wird dann eigentlich die Pfadangabe mit abgespeichert, oder wird auch hier nur test gespeichert ?
Gruß
Frank

  1. Ich kann einen beliebigen Pfad auf meinem Rechner angeben und mir werden alle darunterliegenden Verzeichnisse angezeigt. Leider aber ohne die Pfadangabe.

    Wenn Du einen Verzeichnisbaum rekursiv traversierst, dann liest Du innerhalb einer Verzeichnisebene jeweils nur relative Namen zu dieser Ebene.
    Wenn Du die Ergebnisse aber als absolute Pfade brauchst, dann mußt Du bei jedem rekursiven Aufruf den konkatenierten Pfadnamen des Verzeichnisses mit übergeben.

    Da ich die Traversierung in meinem SiteMapper "von Hand" mache (siehe http://www.teamone.de/selfaktuell/self_forum/40980.html) und für opendir() sowieso den vollständigen Pfadnamen brauche, habe ich den jederzeit zur Hand.
    Bei den Treffern muß ich halt jeweils "$pfad\$file" abspeichern und nicht nur "$file", wie Du es offenbar tust.

    1. Wenn Du mir jetzt noch sagst was rekursiv traversierst bedeutet, wäre ich Dir sehr dankbar.
      Ich bin doch noch ein Anfänger !   ;-)
      Danke
      Frank

      Ich kann einen beliebigen Pfad auf meinem Rechner angeben und mir werden alle darunterliegenden Verzeichnisse angezeigt. Leider aber ohne die Pfadangabe.

      Wenn Du einen Verzeichnisbaum rekursiv traversierst, dann liest Du innerhalb einer Verzeichnisebene jeweils nur relative Namen zu dieser Ebene.
      Wenn Du die Ergebnisse aber als absolute Pfade brauchst, dann mußt Du bei jedem rekursiven Aufruf den konkatenierten Pfadnamen des Verzeichnisses mit übergeben.

      Da ich die Traversierung in meinem SiteMapper "von Hand" mache (siehe http://www.teamone.de/selfaktuell/self_forum/40980.html) und für opendir() sowieso den vollständigen Pfadnamen brauche, habe ich den jederzeit zur Hand.
      Bei den Treffern muß ich halt jeweils "$pfad\$file" abspeichern und nicht nur "$file", wie Du es offenbar tust.

      1. Wenn Du mir jetzt noch sagst was rekursiv traversierst bedeutet, wäre ich Dir sehr dankbar.
        Ich bin doch noch ein Anfänger !   ;-)

        "Traversieren" heißt so ungefähr "ablaufen" (alle Knoten des Baums, der Deine Verzeichnishierarchie darstellt).

        "Rekursiv" heißt so ungefähr "wiederkehrend" und bedeutet, daß Du für die Verarbeitung eines Unterverzeichnisses prinzipiell dieselbe Logik verwendest wie für die Verarbeitung des Wurzelverzeichnisses, lediglich basierend auf einer anderen Startadresse.
        Du rufst also dieselbe Funktion mit einem anderen Parameterwert in sich selbst nochmal auf, falls Du innerhalb eines Verzeichnisses ein anderes Verzeichnis findest.

        1. Na hoffentlich bekomme ich das hin !
          Bisher schaffe ich es nur bis zur ersten Verzeichnisebene. Kann ich ja mal aufschreiben:
          Ist der Anfang schonmal richtig ?
          Und nochmal zu diesem pwd. Geht das nicht unter Windows ?

          print "Nach welcher Zeichenfolge soll gesucht werden ?\n";
          $Zeichenfolge = <STDIN>;
          print "\nWie heißt das Oberverzeichnis, dass durchsucht werden soll ?\n";
          $Oberverzeichnis = <STDIN>;
          if($Oberverzeichnis =~ /\n/)
          {
          chop($Oberverzeichnis);
          }
          else
          {
          exit;
          }
          if($Zeichenfolge =~ /\n/)
          {
          chop($Zeichenfolge);
          }
          else
          {
          exit;
          }
          opendir (DIR,$Oberverzeichnis) print "Verzeichnis ", $Oberverzeichnis, " gibt es nicht.\n";
          while($files = readdir(DIR))
          {
          if (-d "$Oberverzeichnis/$files" && $files ne ".." && $files ne ".")      ## -d prüft ob es sich bei dem File um ein Verzeichnis handelt ##
          {
            push (@Verzeichnisse,$files);
            print @Verzeichnisse
          }
          else
          {
          next;
          }
          }

          Wenn Du mir jetzt noch sagst was rekursiv traversierst bedeutet, wäre ich Dir sehr dankbar.
          Ich bin doch noch ein Anfänger !   ;-)

          "Traversieren" heißt so ungefähr "ablaufen" (alle Knoten des Baums, der Deine Verzeichnishierarchie darstellt).

          "Rekursiv" heißt so ungefähr "wiederkehrend" und bedeutet, daß Du für die Verarbeitung eines Unterverzeichnisses prinzipiell dieselbe Logik verwendest wie für die Verarbeitung des Wurzelverzeichnisses, lediglich basierend auf einer anderen Startadresse.
          Du rufst also dieselbe Funktion mit einem anderen Parameterwert in sich selbst nochmal auf, falls Du innerhalb eines Verzeichnisses ein anderes Verzeichnis findest.

          1. Hallo Frank!

            Na hoffentlich bekomme ich das hin !
            Bisher schaffe ich es nur bis zur ersten Verzeichnisebene. Kann ich ja mal aufschreiben:
            Ist der Anfang schonmal richtig ?

            Vielleicht interessiert Dich der Entwurf, den ich mal bei <../../sfarchiv/1999_4/t07531.htm#a37743> geliefert habe. Da siehst Du dann auch, was Rekursion in der Prxis bedeutet: Die Funktion listdir ruft sich wieder und wieder selbst auf, jeweils mit einem veraenderten Verzeichnis-Parameter.

            Und nochmal zu diesem pwd. Geht das nicht unter Windows ?

            Unter DOS und Windows gibt es kein pwd-Kommando, es heisst hier cd. Also:
                $aktuelles_verzeichnis = cd;
            Aber pass auf, wenn Du das in einem CGI-Script unter MS-IIS verwenden willst: <../../sfarchiv/1999_2/t03170.htm>.

            Calocybe

            1. Vielen Dank ! Es funmktioniert endlich mal was !
              dieses CD läuft dafür aber wahrscheinlich nicht unter Linux, gelle ?

              Hallo Frank!

              Na hoffentlich bekomme ich das hin !
              Bisher schaffe ich es nur bis zur ersten Verzeichnisebene. Kann ich ja mal aufschreiben:
              Ist der Anfang schonmal richtig ?

              Vielleicht interessiert Dich der Entwurf, den ich mal bei <../../sfarchiv/1999_4/t07531.htm#a37743> geliefert habe. Da siehst Du dann auch, was Rekursion in der Prxis bedeutet: Die Funktion listdir ruft sich wieder und wieder selbst auf, jeweils mit einem veraenderten Verzeichnis-Parameter.

              Und nochmal zu diesem pwd. Geht das nicht unter Windows ?

              Unter DOS und Windows gibt es kein pwd-Kommando, es heisst hier cd. Also:
                  $aktuelles_verzeichnis = cd;
              Aber pass auf, wenn Du das in einem CGI-Script unter MS-IIS verwenden willst: <../../sfarchiv/1999_2/t03170.htm>.

              Calocybe

              1. dieses CD läuft dafür aber wahrscheinlich nicht unter Linux, gelle ?

                In meinem Site-Mapper habe ich dieses Problem dadurch umgangen, daß ich das zu traversierende Wurzelverzeichnis gar nicht in meinem Perl-Skript berechne, sondern diesem über die Kommandozeile übergebe.

                Ob ich das Skript dann unter Windows durch eine Batch-Datei oder unter UNIX durch ein Shell-Skript aufrufe, das interessiert das Perl-Skript nicht ...

                Wenn Du plattformunabhängig programmieren willst, dann mußt Du übrigens den Verzeichnisseparator ("" bzw. "/") dynamisch berechnen (irgendwie wird sich das Betriebssystem ja ermitteln lassen).

                1. Huhu!

                  In meinem Site-Mapper habe ich dieses Problem dadurch umgangen, daß ich das zu traversierende Wurzelverzeichnis gar nicht in meinem Perl-Skript berechne, sondern diesem über die Kommandozeile übergebe.

                  Yepp, so wird's gemacht. Oftmals benoetigt man sowieso die relativen Pfade, und da ist man auf diese Weise flexibel, da es einfach nur davon abhaengt, in welcher Form man das Anfangsverzeichnis angibt.

                  Wenn Du plattformunabhängig programmieren willst, dann mußt Du übrigens den Verzeichnisseparator ("" bzw. "/") dynamisch berechnen (irgendwie wird sich das Betriebssystem ja ermitteln lassen).

                  Ich verwende eigentlich immer nur den "/". Der laeuft auch auf Windows ohne Probleme. Ob Perl das selbstaendig umsetzt oder WinNT hier einfach tolerant ist, weiss ich jedoch nicht. Zumindest gibt es auch einige Kommandos, die mit der /-Schreibweise laufen. Wie es auf Win95 aussieht, weiss ich auch nicht, aber wen interessiert das schon... ;-)

                  Calocybe

                  1. Ich verwende eigentlich immer nur den "/". Der laeuft auch auf Windows ohne Probleme.
                    Ob Perl das selbstaendig umsetzt oder WinNT hier einfach tolerant ist, weiss ich jedoch nicht.

                    Hm, das gewöhne ich mir gar nicht erst an.
                    Mein "Baby" hier im Büro ist ein System von knapp 20000 lines of perl, welches insbesondere Windows-Batchfiles generiert und an einen Scheduler übergibt. In diesen brauche ich natürlich die "richtigen" Separatoren - wenn ich beides durcheinander verwende, gibt es nur noch Chaos. Also dann gleich überall "", und immer brav doppelt zum escapen ...

                    Zumindest gibt es auch einige Kommandos, die mit der /-Schreibweise laufen. Wie es auf Win95 aussieht, weiss ich auch nicht, aber wen interessiert das schon... ;-)

                    Mich (mein SiteMapper läuft genau dort) ... :-/