Verzeichnisse interativ Auslesen

Hier mein Vorschlag ein bestimmtes Verzeichnis und seine Unterverzeichnisse auszulesen. Da es im Internet mehr als genug rekursive Lösungen gibt, habe ich mir als Ziel gesetzt, ein Script für eine iterative und prozedurale Lösung zu finden. Das Resultat: Um ein vielfaches mehr Code und ich zweifle auch an der Performance des Scriptes - aber hierbei zählt doch mehr der olympische Gedanke!

Zuerst wird eine ganz gewöhnliche Funktion erstellt, die ein bestimmtes Verzeichnis ausliest und den Inhalt in einem Array zurückgibt! Wie schon gehabt - es wird nur das Basisverzeichnis ausgelesen. Die Funktion wird späters noch öffters aufgerufen.

<?php
function verzeichnis_auslesen($verzeichnis) {
$verzArray = [];  // Ein Array wird initialisiert
$handle = opendir($verzeichnis);  // Der Verzeichnis-Handler 
  while ($datei = readdir($handle)) { 
         if ($datei != "." && $datei != "..") {
            if (is_dir($verzeichnis.$datei)) {
                array_push($verzArray, $verzeichnis.$datei . "/");
            }
         }
   }
closedir($handle);
return $verzArray;

//Funktionsende
?>

Mit der zweiten Funktion alleVerzeichnisse() werden alle verfügbaren Ordner ermittelt - und zwar auf der Basis des Rückgabe-Arrays der Funktion verzeichnis_auslesen(). Die Verzeichnisse des Basisordner sind in einem eindimensionalen Array gespeichert. Die zweite Funktion alleVerzeichnisse() durchsucht brav Schritt für Schritt jeden Eintrag und ermittelt ob es Unterverzeichnisse gibt. Das wiederholt die Funktion solange, bis sie keine Unterverzeichnisse mehr gefunden hat. Damit keine doppelten (reduntanten) Einträge passieren muss die Funktion jedemal aufs neue prüfen, ob das Verzeichniss nicht doch schon im Array gespeichert ist.

<?php
function alleVerzeichnisse($basis) {
$gesamtArray = verzeichnis_auslesen($basis);
$weiter = true;
   
while($weiter == true) {
   $start = count($gesamtArray);
   foreach ($gesamtArray as $eintrag) {
      $tempArray = verzeichnis_auslesen($eintrag);
      if(count($tempArray) > 0) {   // Prüft ob das ausgelesene Verzeichnis ein weiteres Verzeichnis hat.
         $weiter = true;
         $eintrag = true;
         foreach ($tempArray as $wert) {
            foreach ($gesamtArray as $inhalt) {  
               if($inhalt == $wert) {$eintrag = false;}   // Prüft ob der Eintrag schon vorhanden ist.        
            }
         if($eintrag == true) {array_push($gesamtArray, $wert);};  // Fügt nach Prüfung den neuen Wert hinzu.
         }
       }
    }
  $ende = count($gesamtArray);
  if ($start == $ende) {$weiter = false;}
   }  //Ende der while Schleife
   
array_push($gesamtArray, $basis);
sort($gesamtArray);
return $gesamtArray;
}
?>

Wir können jetzt schon das Ergebnis abrufen, indem wir die zweite Funktion alleVerzeichnisse() mit einem Verzeichnis als Übergabeparameter starten. Die Übergabe erfolgt mit dem obligatorischen Schrägstrich am schluss. Um es einfach zu machen, wird das Rückgabe-Array einfach mit print_r ausgegeben - man sieht --> es werden alle Verzeichnisse ausgegeben!

<?php print_r(alleVerzeichnisse("dateien/")); ?>

Nun, nachdem wir alle Verzeichnisse schön geordnet in einem Array haben, ist es ein leichtes mit den Standardmethoden die dazupassenden Dateien zu ermitteln. Die mitDateien() Funktion übernimmt das Array mit allen Verzeichnissen und durchsucht jedes einzelne Verzeichnis nach Dateien. Als Rückgabe bekommt man ein mehrdimensionales Array - und zwar jeweils mit dem Verzeichnis und mit der Datei. Hier kann auch der Code schön erweitert werden - z. B. durch ein Hinzufügen der Dateigrößen usw. Die zwei Rückgabenwerte reichen aber schon aus, um z. B. sie zu iterieren um a href Hyerlinks zu schreiben, oder was weiß ich noch, was man mit dem Ergebenis gerne machen möchte.

<?php 
function mitDateien($vereichnisse) {
$ausgabe = [];  

foreach ($vereichnisse as $eintrag) {
    $handle = opendir($eintrag);  // Der Verzeichnis-Handler 
    while ($datei = readdir($handle)) {
       if ($datei != "." && $datei != "..") {
          if (!is_dir($eintrag.$datei)) {
             $tempArray = array($eintrag, $datei);
             array_push($ausgabe, $tempArray);
           }
        }
     }
   closedir($handle);
      
  }
 return $ausgabe;
}
?>

Wir ermitteln zuerst alle Verzeichnisse. Im Anschluss alle Dateien. Wer es gerne verschachtelt hat, kann auch mit $mitDateien = mitDateien(alleVerzeichnisse("dateien/")); die rein iterative Suche starten. Das Array wird über eine Zählschleife ausgewertet und mit einem einfachen echo Befehl ausgegeben. Zusätzlich wird noch die Anzahl der gefunden Files mit count() angezeigt. (Mitunter ein Grund warum ich eine iterative Lösung ausgearbeitet habe!) In der Zählschleife können dann noch weitere Anpassungen erfolgen - wie z. B. eine Anzeige von index.php untersagen uvm. Der Phantasie sollte keine Grenzen gesetzt werden!

<?php
$meineVerzeichnisse = alleVerzeichnisse("dateien/");
$mitDateien = mitDateien($meineVerzeichnisse);

echo count($mitDateien) . " Files gefunden <hr>";

for($i = 0; $i < count($mitDateien); $i++) {
   echo $mitDateien[$i][0] . $mitDateien[$i][1] . "<br>"; 
}
?>

So, das wars. Natürlich freue ich mich über Feedback (insbesondere über die gute alte eMail). Auch Verbesserungen des Codes nehme ich gerne entgegen. Ihr findet mich auf meiner Webite.

 

css4.at Logo
Autor: Thomas Maier - https://maier.css4.at