Jochen Heinemann: Arghs...ich programmiere mich rein und wieder raus

Hi,

nachdem nun also "mein" ;-) Script zum rekursiven Auslesen eines Verzeichnisses läuft und auch der Rest (diesmal wirklich) meines Scriptes schon klappt, stolper ich gerade dabei rum, ein array (bzw. eine Datei) mit den dateinamen incl. Verzeichnisnamen anzulegen.

Außerdem habe ich den Eindruck, so kompliziert, wie ich mir hier behelfe, kann das doch gar nicht sein.

Kann mir nochmal einer unter die Arme greifen?

Danke Euch

Jochen

code:
-------------------------------------------------------------------
$dateinamen = array ();
$dateipfade = array ();

function show_dir($dir, $pos=2)
{
 global $dateinamen;
 global $dateipfade;

if($pos == 2)
    {
        echo "<hr><pre>";
    }

$handle = @opendir($dir);
    while (($file = readdir($handle)) !== false)
    {
        if (preg_match("=^.{1,2}$=", $file))
        {
            continue;
        }

if(is_dir($dir.$file))
        {
            printf ("% ".$pos."s <b>%s</b>\n", "|-", $file);
            show_dir($dir.$file."/", $pos + 3);
   $verz=$file."/";

}
        else
        {
global $verz;
               printf ("% ".$pos."s %s\n", "|-", $file);

array_push ($dateinamen, $file); //mach dateinamen in ein array
   array_push ($dateipfade, $verz.$file); //mach dateipfade in ein array
   $datei1 = fopen("dateinamen.txt","w");
   for ($i = 0; $i <count($dateinamen); $i++){
   fwrite($datei1, $dateinamen[$i]."\n");  }

$datei2 = fopen("dateipfade.txt","w");
   for ($i = 0; $i <count($dateipfade); $i++){
   fwrite($datei2, $dateipfade[$i]."\n");  }

}
    }

@closedir($handle);

if($pos == 2)
    {
        echo "</pre><hr>";
    }

}
----------------------------------------------------------------------

  1. Hi,

    nachdem nun also "mein" ;-) Script zum rekursiven Auslesen eines Verzeichnisses läuft und auch der Rest (diesmal wirklich) meines Scriptes schon klappt, stolper ich gerade dabei rum, ein array (bzw. eine Datei) mit den dateinamen incl. Verzeichnisnamen anzulegen.

    Bis zur 1. Verzeichnisebene klappt das übrigens.

    Aber ist das nicht fürchterlich umständlich (und zudem falsch) gelöst???

    Jochen

    1. Moin!

      Bis zur 1. Verzeichnisebene klappt das übrigens.

      Aber ist das nicht fürchterlich umständlich (und zudem falsch) gelöst???

      Ich finde es jedenfalls extrem bedenklich, dass du in der Funktion globale Variablen benutzt.

      Zuallererst aber solltest du mal erklären, welches Ergebnis du dir denn vorstellst. In welcher Form willst du die Information "Dateinamen und Verzeichnisse" denn haben? Bedenke dabei auch, dass jeder Dateiname einen ihm zugeordneten Verzeichnisnamen zwingend erfordert, andernfalls findest du die Datei nämlich nicht. Dateiname und Verzeichnisname sind tatsächlich eine untrennbare Einheit.

      - Sven Rautenberg

      --
      My sssignature, my preciousssss!
      1. Moin!

        Bis zur 1. Verzeichnisebene klappt das übrigens.

        Aber ist das nicht fürchterlich umständlich (und zudem falsch) gelöst???

        Ich finde es jedenfalls extrem bedenklich, dass du in der Funktion globale Variablen benutzt.

        Hi Sven,

        wenns anders geht, gerne :-)

        Zuallererst aber solltest du mal erklären, welches Ergebnis du dir denn vorstellst. In welcher Form willst du die Information "Dateinamen und Verzeichnisse" denn haben? Bedenke dabei auch, dass jeder Dateiname einen ihm zugeordneten Verzeichnisnamen zwingend erfordert, andernfalls findest du die Datei nämlich nicht. Dateiname und Verzeichnisname sind tatsächlich eine untrennbare Einheit.

        Ich benötige später zum einen den reinen Dateinamen. Klar, könnte ich auch über "explode" rausfiltern, aber wozu?
        Zum anderen benötige ich den Dateinamen plus Verzeichnis, eben um die Datei auf dem Server für weitere Bearbeitungen auch wirklich finden zu können.

        Grüße, Jochen

        • Sven Rautenberg
        1. Moin!

          Ich finde es jedenfalls extrem bedenklich, dass du in der Funktion globale Variablen benutzt.

          wenns anders geht, gerne :-)

          Es geht auf jeden Fall anders, und du solltest es auch unbedingt so machen. Denn deine Funktion ist dann viel leichter auch woanders verwendbar, du kannst sie unabhängig vom Wissen, welche globalen Variablen sie erfordert, überall einsetzen. Und außerdem ist der Zugriff auf globale Variablen schlechter Programmierstil. Sicher, manchmal vereinfacht das einige Dinge, aber meistens führt es langfristig gesehen eher zu Problemen.

          Ich benötige später zum einen den reinen Dateinamen. Klar, könnte ich auch über "explode" rausfiltern, aber wozu?

          Warum nicht? Redundanz produzieren ist ja nicht unbedingt notwendig, oder? :)

          Als Arrayformat stelle ich mir erstmal ganz simpel, wie du ja auch, eine Liste mit allen gefundenen Pfad- (d.h. Verzeichnis- plus Datei-) Namen vor:

            
          $dir[0]="/dir1/dir2/file";  
          $dir[1]="/dir1/dir3/dir4/file";  
          ...  
          
          

          Dann kriegst du mit basename() aus den Pfadnamen ganz leicht den Dateinamen extrahiert.

          Man könnte sich auch überlegen, den Pfadnamen anstelle als Wert des Arrays als Arrayschlüssel zu verwenden - dann wird der Arraywert frei zur Belegung mit beispielweise den Dateieigenschaften, die man so feststellen kann: Dateigröße, Rechte, Dateityp, Änderungsdatum,...

          In "schlicht" also sowas (Dateigröße in Byte):

            
          $dir["/dir1/dir2/file"]=10256;  
          $dir["/dir1/dir3/dir4/file"]=15675765;  
          ...  
          
          

          Aufgebohrt mit mehreren Angaben empfiehlt sich ein mehrdimensionales Array:

            
          $dir["/dir1/dir2/file"]['size']=10256;  
          $dir["/dir1/dir2/file"]['lastmodified']="20050316231541";  
          $dir["/dir1/dir2/file"]['rights']="0644";  
          $dir["/dir1/dir3/dir4/file"]['size']=15675765;  
          $dir["/dir1/dir3/dir4/file"]['lastmodified']="20050902142311";  
          $dir["/dir1/dir3/dir4/file"]['rights']="0700";  
          ...  
          
          

          In beiden Fällen, egal ob schlicht oder komplexer, kannst du mit einer foreach-Schleife alle gefundenen Dateien durchgehen:

            
          foreach ($dir as $filename => $properties)  
          {  
            echo "Datei ".basename($filename)." im Verzeichnis ".dirname($filename).":<br>";  
            echo "Größe: ".$properties['size']."<br><br>";  
          }  
          
          

          Mit basename() und dirname() hast du zwei recht simple Funktionen zur Ermittlung von Teilen der Pfadangabe, die rein auf Stringbasis arbeiten (also nicht im Dateisystem suchen und damit sehr langsam wären) und praktisch selbsterklärend sind - d.h. auch, dass du nicht durcheinanderkommen kannst, oder sich Pfadname und Dateiname irgendwie voneinander trennen können.

          Also: Was darf es sein?

          - Sven Rautenberg

          --
          My sssignature, my preciousssss!
          1. Hallo Sven,

            puh, ganz schön viele Informationen :-)
            Erstmal vielen, vieln Dank für die ausführlich Antwort und die damit verbundene Mühe.
            Was basename() und dirname() angeht, das hört sich gut an und ich schaus mir in der Doku an.
            Und ok, mach ich nur ein array und ermittel den Verzeichnisnamen später.

            Mein Hauptproblem ist momentan, die Dateien, die rekursiv gefunden werden, mitsamt Pfadangaben ins array, bzw. das Verzeichnis zu schreiben.
            Bei meinem Codebeispiel wird der Pfad nicht kosequent erkannt, abgesehen davon, daß es ohne global gar nicht funktioniert.

            Ich habe mir dieses Script hier ( http://www.php-faq.de/q/q-code-verzeichnis.html ) als Grundlage genommen, verliere aber unterwegs (siehe mein geänderter Code, inkl. global) trotzdem immer wieder der Pfad.

            Übrigens, ein assoziatives Array brauch ich eher nicht, weil die Dateiangaben nicht so wichtig sind. Das Script muß ich im späteren Verlauf noch so gestalten, daß es sich selber aufruft und immer nur eine Datei (oder auch 5 Dateien, weiß noch nicht) gleichzeitig bearbeitet, da ich sonst Probleme mit der Laufzeitbegrenzung von scripten (von Schlund vorgegeben) bekomme.
            Sollte aber gehen, wenn ich das ganze in die Datei schreibe, es immer wieder einlese und dem Script mit auf den Weg gebe, wo es ansetzen soll.

            Grüße, Jochen

            Moin!

            Ich finde es jedenfalls extrem bedenklich, dass du in der Funktion globale Variablen benutzt.

            wenns anders geht, gerne :-)

            Es geht auf jeden Fall anders, und du solltest es auch unbedingt so machen. Denn deine Funktion ist dann viel leichter auch woanders verwendbar, du kannst sie unabhängig vom Wissen, welche globalen Variablen sie erfordert, überall einsetzen. Und außerdem ist der Zugriff auf globale Variablen schlechter Programmierstil. Sicher, manchmal vereinfacht das einige Dinge, aber meistens führt es langfristig gesehen eher zu Problemen.

            Ich benötige später zum einen den reinen Dateinamen. Klar, könnte ich auch über "explode" rausfiltern, aber wozu?

            Warum nicht? Redundanz produzieren ist ja nicht unbedingt notwendig, oder? :)

            Als Arrayformat stelle ich mir erstmal ganz simpel, wie du ja auch, eine Liste mit allen gefundenen Pfad- (d.h. Verzeichnis- plus Datei-) Namen vor:

            $dir[0]="/dir1/dir2/file";
            $dir[1]="/dir1/dir3/dir4/file";
            ...

            
            >   
            > Dann kriegst du mit basename() aus den Pfadnamen ganz leicht den Dateinamen extrahiert.  
            >   
            > Man könnte sich auch überlegen, den Pfadnamen anstelle als Wert des Arrays als Arrayschlüssel zu verwenden - dann wird der Arraywert frei zur Belegung mit beispielweise den Dateieigenschaften, die man so feststellen kann: Dateigröße, Rechte, Dateityp, Änderungsdatum,...  
            >   
            > In "schlicht" also sowas (Dateigröße in Byte):  
            >   
            > ~~~php
              
            
            > $dir["/dir1/dir2/file"]=10256;  
            > $dir["/dir1/dir3/dir4/file"]=15675765;  
            > ...  
            > 
            
            

            Aufgebohrt mit mehreren Angaben empfiehlt sich ein mehrdimensionales Array:

            $dir["/dir1/dir2/file"]['size']=10256;
            $dir["/dir1/dir2/file"]['lastmodified']="20050316231541";
            $dir["/dir1/dir2/file"]['rights']="0644";
            $dir["/dir1/dir3/dir4/file"]['size']=15675765;
            $dir["/dir1/dir3/dir4/file"]['lastmodified']="20050902142311";
            $dir["/dir1/dir3/dir4/file"]['rights']="0700";
            ...

            
            >   
            > In beiden Fällen, egal ob schlicht oder komplexer, kannst du mit einer foreach-Schleife alle gefundenen Dateien durchgehen:  
            >   
            > ~~~php
              
            
            > foreach ($dir as $filename => $properties)  
            > {  
            >   echo "Datei ".basename($filename)." im Verzeichnis ".dirname($filename).":<br>";  
            >   echo "Größe: ".$properties['size']."<br><br>";  
            > }  
            > 
            
            

            Mit basename() und dirname() hast du zwei recht simple Funktionen zur Ermittlung von Teilen der Pfadangabe, die rein auf Stringbasis arbeiten (also nicht im Dateisystem suchen und damit sehr langsam wären) und praktisch selbsterklärend sind - d.h. auch, dass du nicht durcheinanderkommen kannst, oder sich Pfadname und Dateiname irgendwie voneinander trennen können.

            Also: Was darf es sein?

            • Sven Rautenberg
            1. Hello,

              puh, ganz schön viele Informationen :-)

              Noch ein paar Lesetipps, die Dir die Arbeit später erleichtern werden:

              speziell:

              Harzliche Grüße vom Berg
              esst mehr http://www.harte-harzer.de

              Tom

              --
              Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
              Nur selber lernen macht schlau
              1. Hello,

                puh, ganz schön viele Informationen :-)

                Noch ein paar Lesetipps, die Dir die Arbeit später erleichtern werden:

                Arghs...schon wieder Neues :-D
                Jep, alles gelesen und teilweise verstanden und für wichtig befunden.
                Nur zu Link1 noch, inwiefern genau kann der mir helfen?

                Übrigens, danke auch dafür, daß Du möglichst deutsche Links gepostet hast.

                Grüße Jochen

                speziell:

                Harzliche Grüße vom Berg
                esst mehr http://www.harte-harzer.de

                Tom

                1. Hello,

                  Noch ein paar Lesetipps, die Dir die Arbeit später erleichtern werden:

                  Arghs...schon wieder Neues :-D
                  Jep, alles gelesen und teilweise verstanden und für wichtig befunden.
                  Nur zu Link1 noch, inwiefern genau kann der mir helfen?

                  Ich dachte, Du hast alles gelesen, was darunter zu finden ist?
                  Der erste Link beinhaltet die Übersicht über alle Dateifunktionen (_nicht_ der Verzeichnisfunktionen) von PHP

                  Übrigens, danke auch dafür, daß Du möglichst deutsche Links gepostet hast.

                  Das kannst Du in der Darstellung selber umschalten und solltest Du auch tun.
                  Kannst ja erst auf Deutsch lesen und dann im englischen Manual kontrollieren, ob nicht doch 'was anderes drinsteht. Die deutsche Übersetzung ist nämlich oft unvollständig oder manchmal sogar falsch.

                  Harzliche Grüße vom Berg
                  esst mehr http://www.harte-harzer.de

                  Tom

                  --
                  Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                  Nur selber lernen macht schlau
                  1. Das kannst Du in der Darstellung selber umschalten und solltest Du auch tun.
                    Kannst ja erst auf Deutsch lesen und dann im englischen Manual kontrollieren, ob nicht doch 'was anderes drinsteht. Die deutsche Übersetzung ist nämlich oft unvollständig oder manchmal sogar falsch.

                    Oh Mann, sch...e, ist das schwierig, ein auch nur annähernd adäquates Niveau zu so manchem hier zu erreichen (das war ein kompliment an Euch Freaks!). Holla!
                    Aber ich bemühe mich und freu mich darüber, hier fördernde und fordernde Tips zu bekommen.
                    Dank an Euch
                    Jochen

                    Harzliche Grüße vom Berg
                    esst mehr http://www.harte-harzer.de

                    Tom

                    1. Hello,

                      Aber ich bemühe mich und freu mich darüber, hier fördernde und fordernde Tips zu bekommen.

                      Sicher für die Meisten hier kein Problem. Frag nur. Aber versuch nicht gleich zuviel auf einmal. Der Teufel steckt im Detail. Für den Anfang hilft da z.B. auch das Durcharbeiten eines Tutorials (bis zu Mitte etwa sehr empfohlen, dann wird es allerdings spezieller).

                      http://tut.php-q.net

                      Harzliche Grüße vom Berg
                      esst mehr http://www.harte-harzer.de

                      Tom

                      --
                      Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
                      Nur selber lernen macht schlau
            2. Moin!

              Mein Hauptproblem ist momentan, die Dateien, die rekursiv gefunden werden, mitsamt Pfadangaben ins array, bzw. das Verzeichnis zu schreiben.
              Bei meinem Codebeispiel wird der Pfad nicht kosequent erkannt, abgesehen davon, daß es ohne global gar nicht funktioniert.

              Dann machen wir das doch am Besten mal weg:

                
              function show_dir($dir, &$dirarr, $pos=2)  
              // mit der &-Schreibweise übergibst du in die Funktion eine Referenz auf eine Variable, die im Funktionsaufruf übergeben wird. Das ist im Prinzip auch ein Zugriff auf eine globale Variable, aber innerhalb der Funktion mußt du den außerhalb verwendeten Variablennamen nicht wissen, sondern benutzt den oben definierten: $dirarr  
                
              {  
                
                  if($pos == 2)  
                  {  
                      echo "<hr><pre>";  
                  }  
              // Ausgabefunktionen würde ich in dieser Funktion entfernen, die Ausgabe solltest du komplett außerhalb von show_dir() regeln.  
                
                  $handle = @opendir($dir);  
                  while (($file = readdir($handle)) !== false)  
                  {  
                      if (preg_match("=^\.{1,2}$=", $file))  
                      {  
                          continue;  
                      }  
                
                      if(is_dir($dir.$file))  
                      {  
                          printf ("% ".$pos."s <b>%s</b>\n", "|-", $file);  
                          show_dir($dir.$file."/", $dirarr, $pos + 3);  
              // Hier wird zusätzlich das Array $dirarr mit übergeben, damit die rekursive Funktion auch weiter "innen" das Array abkriegt, in das die Dateinamen gelegt werden.  
                      }  
                      else  
                      {  
                          printf ("% ".$pos."s %s\n", "|-", $file);  
                          $dirarr[]=$dir."/".$file  
              // Hier wird durch den []-Operator ans Ende des Arrays einfach ein neuer Eintrag hinzugefügt, wenn eine Datei gefunden wurde. Der Dateiname setzt sich aus $dir und $file zusammen, ergänzt durch einen Slash.  
                      }  
                  }  
                
                  @closedir($handle);  
                
                  if($pos == 2)  
                  {  
                      echo "</pre><hr>";  
                  }  
                
              }  
                
              $namen = array();  
              show_dir("/",$namen);  
              // Dieser Aufruf legt alle gefundenen Dateinamen in $namen ab. Dieses Array kannst du dann später verarbeiten.  
              
              

              Übrigens, ein assoziatives Array brauch ich eher nicht, weil die Dateiangaben nicht so wichtig sind. Das Script muß ich im späteren Verlauf noch so gestalten, daß es sich selber aufruft und immer nur eine Datei (oder auch 5 Dateien, weiß noch nicht) gleichzeitig bearbeitet, da ich sonst Probleme mit der Laufzeitbegrenzung von scripten (von Schlund vorgegeben) bekomme.

              Was hast du denn alles vor mit den Dateinamen?

              Sollte aber gehen, wenn ich das ganze in die Datei schreibe, es immer wieder einlese und dem Script mit auf den Weg gebe, wo es ansetzen soll.

              Vorsicht mit der Gleichzeitigkeit. Du mußt deine Textdatei unbedingt gegen gleichzeitige Benutzung, insbesondere gegen Schreibzugriffe, sperren, wenn dein Skript daran arbeitet. Siehe flock().

              - Sven Rautenberg

              --
              My sssignature, my preciousssss!
              1. Hi Sven,

                habs gelesen, bracuhe aber mit Nachschlagen zum Verstehen etwas länger. Ich melde mich, sobald ich sicher bin, es verstanden oder auch noch nicht ganz verstanden zu haben, ok?
                Sorry, aber bei mir braucht das leider etwas länger. Mit "readonly" ists bei mir leider nicht getan :-D
                Bis später und jetzt schonmal bedankt für die Antwort

                Jochen

                Moin!

                Mein Hauptproblem ist momentan, die Dateien, die rekursiv gefunden werden, mitsamt Pfadangaben ins array, bzw. das Verzeichnis zu schreiben.
                Bei meinem Codebeispiel wird der Pfad nicht kosequent erkannt, abgesehen davon, daß es ohne global gar nicht funktioniert.

                Dann machen wir das doch am Besten mal weg:

                function show_dir($dir, &$dirarr, $pos=2)
                // mit der &-Schreibweise übergibst du in die Funktion eine Referenz auf eine Variable, die im Funktionsaufruf übergeben wird. Das ist im Prinzip auch ein Zugriff auf eine globale Variable, aber innerhalb der Funktion mußt du den außerhalb verwendeten Variablennamen nicht wissen, sondern benutzt den oben definierten: $dirarr

                {

                if($pos == 2)
                    {
                        echo "<hr><pre>";
                    }
                // Ausgabefunktionen würde ich in dieser Funktion entfernen, die Ausgabe solltest du komplett außerhalb von show_dir() regeln.

                $handle = @opendir($dir);
                    while (($file = readdir($handle)) !== false)
                    {
                        if (preg_match("=^.{1,2}$=", $file))
                        {
                            continue;
                        }

                if(is_dir($dir.$file))
                        {
                            printf ("% ".$pos."s <b>%s</b>\n", "|-", $file);
                            show_dir($dir.$file."/", $dirarr, $pos + 3);
                // Hier wird zusätzlich das Array $dirarr mit übergeben, damit die rekursive Funktion auch weiter "innen" das Array abkriegt, in das die Dateinamen gelegt werden.
                        }
                        else
                        {
                            printf ("% ".$pos."s %s\n", "|-", $file);
                            $dirarr[]=$dir."/".$file
                // Hier wird durch den []-Operator ans Ende des Arrays einfach ein neuer Eintrag hinzugefügt, wenn eine Datei gefunden wurde. Der Dateiname setzt sich aus $dir und $file zusammen, ergänzt durch einen Slash.
                        }
                    }

                @closedir($handle);

                if($pos == 2)
                    {
                        echo "</pre><hr>";
                    }

                }

                $namen = array();
                show_dir("/",$namen);
                // Dieser Aufruf legt alle gefundenen Dateinamen in $namen ab. Dieses Array kannst du dann später verarbeiten.

                
                >   
                > > Übrigens, ein assoziatives Array brauch ich eher nicht, weil die Dateiangaben nicht so wichtig sind. Das Script muß ich im späteren Verlauf noch so gestalten, daß es sich selber aufruft und immer nur eine Datei (oder auch 5 Dateien, weiß noch nicht) gleichzeitig bearbeitet, da ich sonst Probleme mit der Laufzeitbegrenzung von scripten (von Schlund vorgegeben) bekomme.  
                >   
                > Was hast du denn alles vor mit den Dateinamen?  
                >   
                > > Sollte aber gehen, wenn ich das ganze in die Datei schreibe, es immer wieder einlese und dem Script mit auf den Weg gebe, wo es ansetzen soll.  
                >   
                > Vorsicht mit der Gleichzeitigkeit. Du mußt deine Textdatei unbedingt gegen gleichzeitige Benutzung, insbesondere gegen Schreibzugriffe, sperren, wenn dein Skript daran arbeitet. Siehe [flock()](http://www.php.net/flock).  
                >   
                >  - Sven Rautenberg
                
              2. Hi,

                  
                
                > if (preg_match("=^\.{1,2}$=", $file))  
                
                

                Ein ganzer Regex für eine pieselige Prüfung auf "."||".."?
                Ja, hömma!

                Aber Scherz beiseite.

                  
                
                > show_dir($dir.$file."/", $dirarr, $pos + 3);  
                
                

                Mich würde interessieren, warum es bei PHP kein Macro o.ä. für das Pfadtrennzeichen gibt, oder habe ich das nur übersehen? Ich habe nicht alle Dateisystemfunktionen daraufhin überprüft, aber in den überflogenen Kommentaren wurde stets nach OS unterschieden. Die einzigen Abstraktionen scheinen auf den ersten Blick dirname() und basename() zu sein, aber die waren ja schon in POSIX-0 vorhanden.
                Es wundert mich doch sehr, das in einer Hochsprache noch Pfade von Hand und vor allem hartcodiert zusammengefummelt werden müssen.

                so short

                Christoph Zurnieden

                1. echo $begrüßung;

                  Mich würde interessieren, warum es bei PHP kein Macro o.ä. für das Pfadtrennzeichen gibt, oder habe ich das nur übersehen?

                  Es gibt eine Konstante namens DIRECTORY_SEPARATOR, die auf der englischsprachigen Handbuchseite zu den Directory Functions aufgeführt ist.

                  echo "$verabschiedung $name";

                  1. Hi,

                    Es gibt eine Konstante namens DIRECTORY_SEPARATOR, die auf der englischsprachigen Handbuchseite zu den Directory Functions aufgeführt ist.

                    Aha. Es ist also tatsächlich möglich, das Problem auf hoher Ebene zu lösen, dirname(), basename() und DIRECTORY_SEPARATOR reichen dafür aus, keinerlei "magic numbers" sind nötig. (Die Dateien "." und ".." übersehe ich einmal geflissentlich ;-) Warum wird das dann nicht genutzt?
                    Obenrum dick einen auf OO machen und untenrum doch wieder nur Handarbeit?
                    So so.
                    ;-)

                    so short

                    Christoph Zurnieden