SELFPHP

SELFPHP-Druckversion
Original Adresse dieser Seite:
http://www.selfphp.de/praxisbuch/praxisbuchseite.php?site=224&group=38&page=2
© 2001-2017 E-Mail SELFPHP OHG, info@selfphp.de
© 2005-2017 E-Mail PHP5 Praxisbuch - Matthias Kannengiesser, m.kannengiesser@selfphp.de


Nützliche Verzeichnisoperationen


Auch zum Thema Verzeichnisoperationen liefern wir noch ein paar nützliche Codeschnipsel. Das erste gibt nach einem Muster eine Liste von Dateinamen.

Beispiel – Nur Dateinamen, die .jpg enthalten

<?php

@$verzeichnis = dir(".") or die("Fehler!");
echo "Dateien:<br>";

while ($datei = $verzeichnis->read()) {
  if (preg_match('/.jpg/',$datei)) {
    echo "$datei<br>";
  }
}

$verzeichnis->close();

?>

Das Muster lässt sich einfach auf jedes Dateiformat anpassen. Um die gefundenen Bilder auszugeben, bedarf es lediglich einer kleinen Anpassung der echo-Anweisung: echo "<img src=$file><br>";.


Alternative – scandir()

Die Funktion scandir() ermöglicht es Ihnen, sämtliche Dateien und Verzeichnisse eines Pfads aufzulisten. Hierbei sorgt die Funktion dafür, dass die gefundenen Dateien und Verzeichnisse in Form eines Arrays zurückgegeben werden. Der optionale Parameter sorting_order erlaubt es, die Reihenfolge der Elemente im Array zu bestimmen, aufsteigend oder absteigend (1).

Beispiel

<pre>
<?php

$verzeichnis = '.';
$daten1 = scandir($verzeichnis);
$daten2 = scandir($verzeichnis, 1);

print_r($daten1);
print_r($daten2);

?>
</pre>

Ausgabe
Array
(
    [0] => .
    [1] => ..
    [2] => test.php
    [3] => test2.txt
)
Array
(
    [1] => test2.txt
    [2] => test.php
    [3] => ..
    [4] => .
)


Alternative – Glob

Eine Alternative, um den Inhalt eines Verzeichnisses auszugeben und hierbei lediglich festgelegte Dateiformate zuzulassen, stellt die Funktion glob() dar.

Beispiel – Nur Dateinamen, die .jpg enthalten, aus dem Verzeichnis »daten«

<?php

echo "Dateien:<br>";

foreach (glob("daten/*.jpg") as $dateiname) {
  echo "$filename Dateigrösse " . filesize($dateiname) . "<br> \n";
}

?>

Die Funktion glob() stellt eine Reihe von Konstanten zur Verfügung, mit deren Hilfe Sie noch wesentlich effektiver Verzeichnisinhalte auslesen können.{PSP}
Die Konstanten können auch miteinander verbunden werden. Hier ein Syntaxbeispiel:

glob("{[ad]*_?.jpg, [ad]*_?.gif}", GLOB_BRACE|GLOB_ERR)

Folgende Platzhalter stehen zur Verfügung:

Beispiel – Nur Dateinamen, die .jpg oder .png enthalten, aus dem Verzeichnis »daten«

<?php

echo "Dateien:<br>";

foreach (glob("daten/{*.png,*.gif}", GLOB_BRACE) as $filename) {
  echo "$filename Dateigrösse " . filesize($filename) . "<br> \n";
  echo "<img src=$filename><br> \n";
}

?>


Bearbeiten sämtlicher Dateien eines Verzeichnisses

Wollen Sie sämtliche Dateien eines Verzeichnisses und dessen Unterverzeichnisse samt Dateien auflisten und bearbeiten, ist dies mit einer Rekursion möglich. Hierfür habe ich eine nützliche Funktion, die Sie jederzeit einsetzen und auf Ihre Bedürfnisse anpassen können:
<?php

// Sämtliche Dateien in und unterhalb des Verzeichnisses erfassen
function lese_verzeichnisse($v_name,$funk_name,$max_tiefe = 10,$tiefe = 0) {
  if ($tiefe >= $max_tiefe) {
    error_log("Maximale Tiefe $max_tiefe von $v_name.");
    return false;
  }
  $sub_vers = array();
  $files = array();
  if (is_dir($v_name) && is_readable($v_name)) {
    $verzeichnis = dir($v_name);
    while (false !== ($datei = $verzeichnis->read())) {
      // . und .. nicht ausgeben
      if (('.' == $datei) || ('..' == $datei)) {
        continue;
      }
      // Verzeichnisse und symbolische Links
      if (is_dir("$v_name/$datei")) {
        array_push($sub_vers,"$v_name/$datei");
      } else {
        $funk_name("$v_name/$datei");
      }
    }
    $verzeichnis->close();
    // Rekursiver Durchlauf, um die jeweiligen
    // Unterverzeichnisse zu erreichen
    foreach ($sub_vers as $sub_ver) {
      lese_verzeichnisse($sub_ver,$funk_name,$max_tiefe,$tiefe+1);
    }
  }
}

// Funktion zur Formatierung der Ausgabe
function printatime($p_datei) {
  print "<a href=$p_datei>".basename($p_datei)."</a><br>";
}

lese_verzeichnisse('.','printatime');

?>
{PSP}Die Funktion bearbeitet sämtliche gefundenen Dateien, indem sie der Ausgabe einen Hyperlink hinzufügt, sodass sich die Dateien einzeln ansprechen lassen.


Besonderheit

Da is_dir() true zurückgibt, wenn es auf einen symbolischen Link trifft, der auf ein Verzeichnis verweist, folgt die Funktion auch symbolischen Links. Sollten Sie den symbolischen Links nicht folgen wollen, ändern Sie die Codezeile:

if (is_dir("$v_name/$datei")) {

in:

if (is_dir("$v_name/$datei") && (! is_link("$v_name/$datei"))) {