PHP findet alle Dateien in einem Ordner. Scandir – Ruft eine Liste der Dateien und Verzeichnisse ab, die sich im angegebenen Pfad befinden. Ein Verzeichnis auflisten

In dieser Lektion beschäftigen wir uns mit einer typischen Aufgabe, die bei der Arbeit an einem PHP-Projekt anfällt: dem Abrufen einer Liste von Dateien und Verzeichnissen. Wir werden mehrere grundlegende und anspruchsvollere Ansätze diskutieren und die Vor- und Nachteile jedes einzelnen auflisten. Die ersten drei Lösungen verwenden Standard-PHP-Funktionen, und dann werden wir eine robustere Lösung mit SPL-Iteratoren einführen.

Zum Zweck der inhaltlichen Diskussion der Lösung und Demonstrationen gehen wir davon aus, dass die Verzeichnisstruktur wie folgt ist:

\---manager | \---user | \---document.txt | \---data.dat | \---style.css |---article.txt |---master.dat |---script.php |---test.dat |---text.txt

Grundlegende Lösungen

Der erste Lösungssatz basiert auf der Verwendung der Funktion glob(), einer Kombination der Funktionen opendir() , readdir() und closeir() sowie der Funktion scandir().

Verwendung von glob()

Die erste Lösung basiert auf der Verwendung der Funktion glob(), mit der Sie mithilfe von Mustern nach Pfaden suchen können. Die Funktion hat zwei Parameter:

  • $pattern (erforderlich): Suchmuster
  • $flags (optional): ein oder mehrere Flags, deren Beschreibungen in der Dokumentation zu finden sind

Schauen wir uns Beispiele an. Durchsuchen eines Verzeichnisses nach allen Dateien und Verzeichnissen, deren Namen mit enden .txt, sollten Sie den Code verwenden:

Wenn wir die Variable $filelist anzeigen, erhalten wir:

Array (0 => „article.txt“, 1 => „text.txt“)

Wenn Sie eine Liste von Dateien und Verzeichnissen benötigen, deren Namen mit „te“ beginnen, sieht der Code folgendermaßen aus:

Und die Ausgabe sieht so aus:

Array (0 => „test.dat“, 1 => „text.txt“)

Und um eine Liste nur der Verzeichnisse zu erhalten, deren Namen „ma“ enthalten, verwenden Sie den Code:

Das letzte Beispiel gibt Folgendes aus:

Array (0 => „Manager“)

Beachten Sie, dass im letzten Beispiel das Flag GLOB_ONLYDIR als zweiter Parameter der Funktion verwendet wird. Daher wird die Datei „master.dat“ aus der Liste ausgeschlossen. Obwohl die Funktion glob() sehr einfach zu verwenden ist, ist sie manchmal nicht flexibel genug. Beispielsweise gibt es kein Flag, um nur Dateien (keine Verzeichnisse) abzurufen, die dem Muster entsprechen.

Wir verwenden opendir() , readdir() und closeir() .

Der zweite Ansatz zum Erhalten einer Liste von Dateien und Verzeichnissen, den wir besprechen werden, besteht in der Verwendung der Funktionen opendir() , readdir() und closeir() .

Die Funktion opendir() öffnet ein Verzeichnis und gibt ein Verbindungshandle zurück. Sobald das Handle erhalten wurde, kann die Funktion readdir() verwendet werden. Bei jedem Aufruf gibt diese Funktion den Namen der nächsten Datei oder des nächsten Verzeichnisses innerhalb des geöffneten Verzeichnisses zurück. Wenn bereits alle Namen aufgelistet sind, kehrt die Funktion zurück FALSCH. Die Funktion „closedir()“ dient zum Schließen des Handles.

Im Gegensatz zur Verwendung der glob()-Funktion ist dieser Ansatz komplexer, da Sie keine Parameter zum Filtern der Liste der zurückgegebenen Datei- und Verzeichnisnamen haben. Sie müssen die Filterung selbst durchführen, um die gewünschten Ergebnisse zu erhalten.

Das folgende Beispiel gibt eine Liste von Datei- und Verzeichnisnamen zurück, die mit „te“ beginnen:

Wenn Sie den obigen Code ausführen, enthält die Variable $entry Einschlüsse wie „.“ Und "..". Dabei handelt es sich um zwei virtuelle Verzeichnisse, die in jedem Verzeichnis des Dateisystems vorhanden sind. Sie stellen das aktuelle Verzeichnis bzw. das übergeordnete Verzeichnis dar.

Im zweiten Beispiel werden nur die im angegebenen Verzeichnis enthaltenen Dateien angezeigt.

Das Beispiel ergibt Folgendes:

Array (0 => „article.txt“, 1 => „master.dat“, 2 => „script.php“, 3 => „test.dat“, 4 => „text.txt“)

Verwendung von scandir()

Abschließend stellen wir die Funktion scandir() vor. Es gibt nur einen erforderlichen Parameter: den Lesepfad. Die Funktion gibt ein Array von Dateien und Verzeichnissen zurück, die sich im angegebenen Pfad befinden. Um eine Liste von Dateien und Verzeichnissen basierend auf einem bestimmten Kriterium zu erhalten, müssen Sie eine zusätzliche Filterung durchführen. Andererseits ist die Lösung übersichtlicher und erfordert keine Handle-Verwaltung.

Dieses Beispiel zeigt, wie Sie eine Liste von Dateien und Verzeichnissen erhalten, deren Namen mit „te“ beginnen:

Lassen Sie uns SPL-Iteratoren verwenden

Schauen wir uns nun die Verwendung von SPL-Iteratoren an. Aber bevor wir mit der Lösung unseres Problems beginnen, geben wir eine Einführung in die SPL-Bibliothek und die Iteratoren. Die SPL-Bibliothek bietet eine Reihe von Klassen für objektorientierte Datenstrukturen, Iteratoren, Dateideskriptoren und mehr.

Einer der Vorteile von Iteratoren besteht darin, dass es sich um Klassen handelt, die je nach Bedarf erweitert werden können. Ein weiterer Vorteil besteht darin, dass Iteratoren über eigene Methoden verfügen, die zur Lösung vieler häufiger Probleme nützlich sind und sich an einem Ort befinden. Sehen Sie sich ein Beispiel für die Verwendung von FilesystemIterator im Vergleich zu readdir() an. Beide Methoden verwenden eine Schleife, aber mit readdir() verarbeiten Sie nur einen String, während FilesystemIterator mit einem Objekt arbeitet, das zusätzliche Informationen über die Datei oder das Verzeichnis enthalten kann (Größe, Besitzer, Berechtigungen usw.).

Natürlich bietet PHP die Möglichkeit, solche Informationen mithilfe von Funktionen wie filesize() und fileowner() abzurufen. Aber PHP5 basiert auf der Verwendung des OOP-Konzepts. Daher ist es besser, moderne Methoden der Arbeit mit einer Programmiersprache zu verwenden. Auf unserer Website finden Sie Lektionen zum Arbeiten mit Iteratoren.

Wie bereits im wässrigen Teil des Tutorials erwähnt, werden wir uns mit der Verwendung von FilesystemIterator, RecursiveDirectoryIterator und GlobIterator befassen. Der erste erbt von DirectoryIterator und der Rest von FilesystemIterator . Sie haben alle denselben Konstruktor, der zwei Parameter akzeptiert:

  • $path (erforderlich): Pfad zum Dateisystemeintrag, für den Vorgänge ausgeführt werden
  • $flags (optional): ein oder mehrere in der Dokumentation aufgeführte Flags

Der eigentliche Unterschied zwischen diesen Iteratoren besteht darin, wie sie zum Navigieren entlang eines bestimmten Pfads verwendet werden.

FilesystemIterator

Die Verwendung von FilesystemIterator ist sehr einfach. Sehen wir es uns in Aktion an. Wir stellen zwei Beispiele vor. Der erste zeigt eine Suche nach allen Dateien und Verzeichnissen, deren Namen mit „te“ beginnen. Das zweite Beispiel verwendet einen anderen RegexIterator, um alle Dateien und Verzeichnisse zu finden, deren Namen mit „t.dat“ oder „t.php“ enden. Der RegexIterator wird verwendet, um das Ergebnis basierend auf regulären Ausdrücken zu filtern.

getFilename(), "te") === 0) ( $filelist = $entry->getFilename(); ) )

Der obige Code erzeugt ein ähnliches Ergebnis wie die vorherigen Beispiele.

Zweites Beispiel mit RegexIterator:

getFilename(); )

Es wird ausgegeben:

Array (0 => „script.php“, 1 => „test.dat“)

RecursiveDirectoryIterator

Der RecursiveDirectoryIterator bietet eine Schnittstelle zum rekursiven Durchlaufen von Dateisystemverzeichnissen. Es verfügt über mehrere nützliche Methoden wie getChildren() und hasChildren(), die einen Iterator für den aktuellen Speicherort zurückgeben, wenn es sich um ein Verzeichnis handelt, und prüfen, ob der aktuelle Einstiegspunkt ein Verzeichnis ist. Das folgende Beispiel demonstriert die Verwendung von RecursiveDirectoryIterator und getChildren() . Das Ergebnis wird das gleiche sein wie in den vorherigen Beispielen.

getChildren(), "/t\.(php|dat)$/"); $filelist = array(); foreach($filter as $entry) ( $filelist = $entry->getFilename(); )

GlobIterator

Der GlobIterator durchläuft das Dateisystem auf die gleiche Weise wie die Funktion glob(). Der erste Parameter kann eine Vorlage für den Namen enthalten. Das Beispiel demonstriert die Verwendung von GlobIterator mit dem gleichen Ergebnis wie zuvor.

getFilename(); )

Abschluss

Diese Lektion demonstriert die Verwendung verschiedener Ansätze, um dasselbe Ziel zu erreichen: das Abrufen einer Liste von Dateien und Verzeichnissen. Folgende Kernpunkte sollten beachtet werden:

  • Die Funktion glob() ist eine integrierte Lösung, aber nicht flexibel genug.
  • Eine auf opendir() , readdir() und closeir() basierende Lösung ist komplexer und erfordert zusätzliche Filterung, ist aber flexibler.
  • Die Funktion scandir() erfordert zusätzliche Filterung, funktioniert aber ohne Verarbeitung des Handles.
  • Wenn Sie einen OOP-Ansatz verwenden, sollten Sie die SPL-Bibliothek verwenden. Darüber hinaus können Sie Klassen um Ihre eigene Funktionalität erweitern.
  • Der GlobIterator verfügt über eine Vorfilterfunktion, während andere RegexIterator verwenden.

scandir - Ruft eine Liste der Dateien und Verzeichnisse ab, die sich im angegebenen Pfad befinden

Beschreibung

Array scandir (string $directory [, int $sorting_order = SCANDIR_SORT_ASCENDING [, Ressource $context ]])

Rückgaben Array, enthält die Namen von Dateien und Verzeichnissen, die sich entlang des im Verzeichnisparameter übergebenen Pfads befinden.

Liste der Parameter

Katalog zum Scannen.

Sortierreihenfolge

Standardmäßig erfolgt die Sortierung alphabetisch in aufsteigender Reihenfolge. Wenn der optionale Parameter sorting_order auf gesetzt ist SCANDIR_SORT_DESCENDING Die Sortierung erfolgt alphabetisch in absteigender Reihenfolge. Wenn es eingestellt ist SCANDIR_SORT_NONE, dann wird keine Sortierung durchgeführt.

Kontext

Eine Beschreibung des Kontextparameters finden Sie im Abschnitt „Threads“ dieses Handbuchs.

Rückgabewerte

Rückgaben Array Dateinamen bei Erfolg oder FALSCH im Fehlerfall. Wenn das Verzeichnis kein Verzeichnis ist, wird zurückgegeben FALSCH und eine Level-Fehlermeldung wird generiert E_WARNUNG.

Liste der Änderungen

Beispiele

Beispiel Nr. 1 Einfaches Beispiel für die Verwendung einer Funktion scandir()

$dir = "/tmp" ;
$files1 = scandir($dir);
$files2 = scandir($dir, 1);

Print_r($files1);
print_r($files2);
?>

Das Ergebnis der Ausführung dieses Beispiels wird etwa so aussehen:

Array ( => . => .. => bar.php => foo.txt => somedir) Array ( => somedir => foo.txt => bar.php => .. => .)

Beispiel #2 Alternative Funktionsoption scandir() für PHP 4

$dir = "/tmp" ;
$dh = opendir($dir);
while (false !== ($filename = readdir ($dh ))) (
$files = $filename ;
}

Sort($files);

Print_r($files);

Rsort($files);

Print_r($files);

Beim Auflisten von Verzeichnissen werden Informationen über Verzeichnisse und Dateien für ein bestimmtes übergeordnetes Verzeichnis abgerufen sowie die Möglichkeit, verschiedene Filter auf diese Daten anzuwenden, um die Ausgabe zu korrigieren.

In diesem Beispiel werden wir versuchen, eine typische Aufgabe zu bewältigen, die in fast jedem Fall vorkommt PHP Projekt – Abrufen einer Liste von Verzeichnissen und/oder Dateien. Das Beispiel verwendet mehrere grundlegende und komplexere Ansätze und erläutert die Vor- und Nachteile jeder Technik. Die ersten drei Lösungen nutzen Standard-PHP-Funktionen. Die neueste, zuverlässigere Lösung mit PHP-SPL-Iteratoren.


Für eine visuellere Darstellung verwenden wir eine Verzeichnisstruktur, die wie folgt aussieht:


\-Anwendung | \-Benutzer | \-data.apk | \-style.css | \-test.txt |-readme.txt |-script.php |-serial.txt |-test.html |-test.js

Grundlegende Lösungen
Die erste Reihe von Beispielen verwendet Funktionen glob() und Kombinationen von Funktionen opendir(), readdir(), geschlossenir(), sowie die Funktion scandir().

Verwendung von glob()

Beispiel für die Verwendung der PHP-Funktion glob(), mit dem Sie anhand eines Musters nach einem Pfad suchen können.
Funktion Kugel( $muster,$flags) arbeitet mit zwei Argumenten:
  • $muster(erforderlich): Suchmusterzeichenfolge
  • $flags
    • GLOB_MARK– Fügt jedem zurückgegebenen Verzeichnis einen Schrägstrich hinzu.
    • GLOB_NOSORT- Gibt Dateien in der Form zurück, in der sie im Verzeichnis enthalten sind (ohne Sortierung). Wenn dieses Flag nicht angegeben ist, werden die Namen alphabetisch sortiert.
    • GLOB_NOCHECK– Gibt ein Suchmuster zurück, wenn damit keine Dateien gefunden wurden.
    • GLOB_NOESCAPE- Backslashes entkommen Metazeichen nicht.
    • GLOB_BRACE– Erweitert (a,b,c) so, dass es mit „a“, „b“ oder „c“ übereinstimmt.
    • GLOB_ONLYDIR– Gibt nur Verzeichnisse zurück, die dem Muster entsprechen.
    • GLOB_ERR- Stoppt bei Lesefehlern (z. B. Verzeichnissen ohne Leseberechtigung), standardmäßig werden Fehler ignoriert.
Um ein Verzeichnis nach allen Dateien und Verzeichnissen zu durchsuchen, deren Namen auf .txt enden, verwenden Sie den folgenden Code:In der Ausgabe erhalten wir das folgende Ergebnis: array(2) ( => string(10) "readme.txt" => string(10) "serial.txt" ) Wenn Sie eine Liste der Dateien und Verzeichnisse benötigen, deren Namen Beginnen Sie mit „te“:In der Ausgabe erhalten wir das folgende Ergebnis: array(2) ( => string(9) "test.html" => string(7) "test.js" ) Es werden nur Verzeichnisse in der Liste angezeigt, deren Namen „er“ enthalten:In der Ausgabe erhalten wir folgendes Ergebnis: array(1) ( => string(4) "User" )

Das letzte Beispiel verwendet die Flagge GLOB_ONLYDIR als zweites Argument der Funktion. Daher wurde nur das Verzeichnis „Benutzer“ im Namen, das „er“ enthält, in die Liste aufgenommen. Die Funktion glob() ist sehr einfach zu verwenden, aber manchmal ist sie nicht flexibel genug. Es gibt kein Flag, um nur Dateien (keine Verzeichnisse) abzurufen, die dem Muster entsprechen.

Verwendung von opendir(), readdir() und closeir().

Die nächste Methode zum Abrufen einer Liste von Dateien und Verzeichnissen ist die Verwendung von PHP-Funktionen opendir(), readdir() Und geschlossenir().

Funktion opendir() Gibt ein Handle für das geöffnete Verzeichnis zurück. Sobald das Handle empfangen wurde, können Sie die Funktion verwenden readdir(). Beim Zugriff auf ein Handle wird die Funktion readdir() Zeigt den Namen der nächsten Datei oder des nächsten Verzeichnisses an. Wenn alle im Deskriptor enthaltenen Elemente bereits aufgezählt wurden, wird die Funktion readdir() werde wiederkommen FALSCH. Um den Deskriptor zu schließen, verwenden wir die Funktion geschlossenir().


Im Gegensatz zur Verwendung der PHP-Funktion , dieser Ansatz ist etwas komplizierter. Es ist nicht möglich, Filterparameter festzulegen, die dabei helfen, vorab eine Liste der zurückgegebenen Datei- und Verzeichnisnamen zu erstellen. Um die erforderliche Liste von Dateien und Verzeichnissen zu erhalten, muss die Filterung unabhängig durchgeführt werden.


Das folgende Beispiel gibt eine Liste von Datei- und Verzeichnisnamen zurück, die mit „Us“ beginnen:Die Ausgabe lautet: array(1) ( => string(4) "User" ) Das folgende Beispiel gibt nur die Dateien aus, die im angegebenen Verzeichnis enthalten sind.In der Ausgabe erhalten wir folgendes Ergebnis: array(5) ( => string(10) „script.php“ => string(7) „test.js“ => string(9) „test.html“ => string (10) „serial.txt“ => string(10) „readme.txt“ )

Verwenden von scandir().

Schauen wir uns zum Abschluss ein Beispiel für die Verwendung einer PHP-Funktion an scandir(). Es gibt nur ein erforderliches Attribut – den Pfad zum Leseverzeichnis. Das Ergebnis der Funktion ist ein Array von Dateien und Verzeichnissen, die sich entlang des im Argument angegebenen Pfads befinden. Wie im vorherigen Beispiel müssen Sie dies selbst tun, um eine gefilterte Liste von Dateien und Verzeichnissen zu erhalten. Optisch ist die Lösung kürzer und es ist keine Deskriptorverwaltung erforderlich.


Das Beispiel zeigt, wie man eine Liste von Dateien und Verzeichnissen erhält, deren Namen mit „te“ beginnen:In der Ausgabe erhalten wir folgendes Ergebnis: array(2) ( => string(9) "test.html" => string(7) "test.js" )

Erweiterte Lösung mit PHP SPL
Zuverlässigere Lösung mit SPL-Iteratoren FilesystemIterator, RecursiveDirectoryIterator Und GlobIterator.

Verwendung von SPL-Iteratoren.

Schauen wir uns die Verwendung von SPL-Iteratoren an. Bevor wir mit der Lösung des Problems beginnen, machen wir uns ein wenig mit der PHP-SPL-Bibliothek und den Iteratoren vertraut. Die SPL-Bibliothek bietet spezielle Klassensätze für objektorientierte Datenstrukturen, Iteratoren, Dateideskriptoren und mehr.


Der Hauptvorteil von Iteratoren besteht darin, dass sie Klassen sind und mithilfe des standardmäßigen PHP-Klassenvererbungsmechanismus erweitert werden können. Ein weiterer Pluspunkt ist, dass Iteratoren über eigene Methoden verfügen, die zur Lösung häufiger Probleme nützlich sein können, und dass sie alle an einem Ort gespeichert sind. Schauen wir uns ein Anwendungsbeispiel an FilesystemIterator und vergleichen mit readdir(). Beide Methoden verwenden eine Schleife, aber für den Fall readdir() es wird möglich sein, nur die Zeichenfolge zu verarbeiten, aber FilesystemIterator kann mit einem Objekt arbeiten. Diese können zusätzliche Informationen über die Datei oder das Verzeichnis enthalten, z. B. Eigentümer, Größe, Zugriffsrechte usw.


Natürlich hat PHP die Möglichkeit, diese Informationen mithilfe von Funktionen zu erhalten, Dateigröße(), Dateibesitzer() und andere. Aber PHP hat, wie jede Programmiersprache, die Fähigkeit, sich zu verändern. In PHP5 besteht ein zunehmender Wunsch, OOP-Konzepte zu verwenden. Daher ist es besser, moderne Methoden der Arbeit mit einer Programmiersprache zu verwenden.


Erwägen Sie die Verwendung FilesystemIterator, RecursiveDirectoryIterator Und GlobIterator. Der erste Iterator erbt von DirectoryIterator, und der Rest von FilesystemIterator. Sie haben alle denselben Konstruktor, der zwei Argumente akzeptiert:

  • $pfad(erforderlich): Pfad zum Dateisystemelement, für das Vorgänge ausgeführt werden
  • $flags(optional): ein oder mehrere Flags
    • FilesystemIterator::CURRENT_AS_PATHNAME Bewirkt, dass die Methode FilesystemIterator::current() einen Pfad zurückgibt.
    • FilesystemIterator::CURRENT_AS_FILEINFO Bewirkt, dass die Methode FilesystemIterator::current() eine Instanz von SplFileInfo zurückgibt.
    • FilesystemIterator::CURRENT_AS_SELF Bewirkt, dass die Methode FilesystemIterator::current() $this (FilesystemIterator) zurückgibt.
    • FilesystemIterator::CURRENT_MODE_MASK Maskiert FilesystemIterator::current()
    • FilesystemIterator::KEY_AS_PATHNAME Bewirkt, dass die Methode FilesystemIterator::key() einen Pfad zurückgibt.
    • FilesystemIterator::KEY_AS_FILENAME Bewirkt, dass die Methode FilesystemIterator::key() den Dateinamen zurückgibt.
    • FilesystemIterator::FOLLOW_SYMLINKS Erzwingt, dass die RecursiveDirectoryIterator::hasChildren()-Methode symbolischen Links folgt.
    • FilesystemIterator::KEY_MODE_MASK Maskiert FilesystemIterator::key()
    • FilesystemIterator::NEW_CURRENT_AND_KEY Identisch mit FilesystemIterator::KEY_AS_FILENAME | FilesystemIterator::CURRENT_AS_FILEINFO.
    • FilesystemIterator::SKIP_DOTSÜberspringt Punktdateien (. und ..).
    • FilesystemIterator::UNIX_PATHS Erzwingt die Verwendung von Backslashes im Unix-Stil für alle Pfade, unabhängig von den Standardeinstellungen des Systems.

Der Unterschied zwischen diesen Iteratoren besteht darin, wie sie zum Navigieren entlang eines bestimmten Pfads verwendet werden.

FilesystemIterator

Verwenden FilesystemIterator ganz einfach.
Das Beispiel zeigt eine Suche nach allen Dateien und Verzeichnissen, deren Namen mit „te“ beginnen.

getFilename(),"te")===0): $arFileList = $obFile->getFilename();

endif; endforeach; //Das Ergebnis ausgeben var_dump($arFileList); ?> In der Ausgabe erhalten wir folgendes Ergebnis: array(2) ( => string(7) "test.js" => string(9) "test.html" ) Beispiel für die Verwendung eines anderen Iterators RegexIterator Beispiel für die Verwendung eines anderen Iterators um nach allen Dateien und Verzeichnissen zu suchen, deren Namen mit „t.js“ oder „t.php“ enden. Iterator

wird zum Filtern des Ergebnisses verwendet und verwendet eine Engine für reguläre Ausdrücke.

RecursiveDirectoryIterator

getFilename(); endforeach; //Das Ergebnis ausgeben var_dump($arFileList); ?> In der Ausgabe erhalten wir folgendes Ergebnis: array(2) ( => string(10) "script.php" => string(7) "test.js" ) RecursiveDirectoryIterator Iterator Bietet eine Schnittstelle zum rekursiven Durchlaufen von Dateisystemverzeichnissen. Es verfügt über mehrere nützliche Methoden, z Und getChildren() hasChildren()


RecursiveDirectoryIterator Und Bietet eine Schnittstelle zum rekursiven Durchlaufen von Dateisystemverzeichnissen. Es verfügt über mehrere nützliche Methoden, z. , die einen Iterator für den aktuellen Standort zurückgeben, wenn es sich um ein Verzeichnis handelt, und prüfen, ob der aktuelle Einstiegspunkt ein Verzeichnis ist.

GlobIterator

getFilename(); endforeach; //Das Ergebnis ausgeben var_dump($arFileList); ?> In der Ausgabe erhalten wir folgendes Ergebnis: array(2) ( => string(10) "script.php" => string(7) "test.js" ) GlobIterator getChildren(), "/t\.(txt|css)$/"); $arFileList = array(); foreach($rxIterator as $obFile): $arFileList = $obFile->getFilename(); endforeach; //Das Ergebnis ausgeben var_dump($arFileList); ?> In der Ausgabe erhalten wir in diesem Fall folgendes Ergebnis – dies ist eine Datei aus dem „Benutzer“-Verzeichnis: array(1) ( => string(8) „test.txt“ )


führt einen Dateidurchlauf ähnlich dem durch. Das erste Attribut kann ein Namensmuster enthalten. GlobIterator Das Beispiel demonstriert die Verwendungmit dem gleichen Ergebnis wie zuvor.

Abschluss

In den obigen Beispielen wurden verschiedene PHP-Methoden untersucht, um dasselbe Ziel zu erreichen: eine Liste von Dateien und Verzeichnissen zu erhalten.

Anhand der Beispiele lassen sich folgende Hauptpunkte hervorheben:

In dieser Lektion beschäftigen wir uns mit einer typischen Aufgabe, die bei der Arbeit an einem PHP-Projekt anfällt: dem Abrufen einer Liste von Dateien und Verzeichnissen. Wir werden mehrere grundlegende und anspruchsvollere Ansätze diskutieren und die Vor- und Nachteile jedes einzelnen auflisten. Die ersten drei Lösungen verwenden Standard-PHP-Funktionen, und dann werden wir eine robustere Lösung mit SPL-Iteratoren einführen.

Zum Zweck der inhaltlichen Diskussion der Lösung und Demonstrationen gehen wir davon aus, dass die Verzeichnisstruktur wie folgt ist:

\---manager | \---user | \---document.txt | \---data.dat | \---style.css |---article.txt |---master.dat |---script.php |---test.dat |---text.txt

Grundlegende Lösungen

Der erste Lösungssatz basiert auf der Verwendung der Funktion glob(), einer Kombination der Funktionen opendir() , readdir() und closeir() sowie der Funktion scandir().

Verwendung von glob()

Die erste Lösung basiert auf der Verwendung der Funktion glob(), mit der Sie mithilfe von Mustern nach Pfaden suchen können. Die Funktion hat zwei Parameter:

  • $pattern (erforderlich): Suchmuster
  • $flags (optional): ein oder mehrere Flags, deren Beschreibungen in der Dokumentation zu finden sind

Schauen wir uns Beispiele an. Durchsuchen eines Verzeichnisses nach allen Dateien und Verzeichnissen, deren Namen mit enden .txt, sollten Sie den Code verwenden:

Wenn wir die Variable $filelist anzeigen, erhalten wir:

Array (0 => „article.txt“, 1 => „text.txt“)

Wenn Sie eine Liste von Dateien und Verzeichnissen benötigen, deren Namen mit „te“ beginnen, sieht der Code folgendermaßen aus:

Und die Ausgabe sieht so aus:

Array (0 => „test.dat“, 1 => „text.txt“)

Und um eine Liste nur der Verzeichnisse zu erhalten, deren Namen „ma“ enthalten, verwenden Sie den Code:

Das letzte Beispiel gibt Folgendes aus:

Array (0 => „Manager“)

Beachten Sie, dass im letzten Beispiel das Flag GLOB_ONLYDIR als zweiter Parameter der Funktion verwendet wird. Daher wird die Datei „master.dat“ aus der Liste ausgeschlossen. Obwohl die Funktion glob() sehr einfach zu verwenden ist, ist sie manchmal nicht flexibel genug. Beispielsweise gibt es kein Flag, um nur Dateien (keine Verzeichnisse) abzurufen, die dem Muster entsprechen.

Wir verwenden opendir() , readdir() und closeir() .

Der zweite Ansatz zum Erhalten einer Liste von Dateien und Verzeichnissen, den wir besprechen werden, besteht in der Verwendung der Funktionen opendir() , readdir() und closeir() .

Die Funktion opendir() öffnet ein Verzeichnis und gibt ein Verbindungshandle zurück. Sobald das Handle erhalten wurde, kann die Funktion readdir() verwendet werden. Bei jedem Aufruf gibt diese Funktion den Namen der nächsten Datei oder des nächsten Verzeichnisses innerhalb des geöffneten Verzeichnisses zurück. Wenn bereits alle Namen aufgelistet sind, kehrt die Funktion zurück FALSCH. Die Funktion „closedir()“ dient zum Schließen des Handles.

Im Gegensatz zur Verwendung der glob()-Funktion ist dieser Ansatz komplexer, da Sie keine Parameter zum Filtern der Liste der zurückgegebenen Datei- und Verzeichnisnamen haben. Sie müssen die Filterung selbst durchführen, um die gewünschten Ergebnisse zu erhalten.

Das folgende Beispiel gibt eine Liste von Datei- und Verzeichnisnamen zurück, die mit „te“ beginnen:

Wenn Sie den obigen Code ausführen, enthält die Variable $entry Einschlüsse wie „.“ Und "..". Dabei handelt es sich um zwei virtuelle Verzeichnisse, die in jedem Verzeichnis des Dateisystems vorhanden sind. Sie stellen das aktuelle Verzeichnis bzw. das übergeordnete Verzeichnis dar.

Im zweiten Beispiel werden nur die im angegebenen Verzeichnis enthaltenen Dateien angezeigt.

Das Beispiel ergibt Folgendes:

Array (0 => „article.txt“, 1 => „master.dat“, 2 => „script.php“, 3 => „test.dat“, 4 => „text.txt“)

Verwendung von scandir()

Abschließend stellen wir die Funktion scandir() vor. Es gibt nur einen erforderlichen Parameter: den Lesepfad. Die Funktion gibt ein Array von Dateien und Verzeichnissen zurück, die sich im angegebenen Pfad befinden. Um eine Liste von Dateien und Verzeichnissen basierend auf einem bestimmten Kriterium zu erhalten, müssen Sie eine zusätzliche Filterung durchführen. Andererseits ist die Lösung übersichtlicher und erfordert keine Handle-Verwaltung.

Dieses Beispiel zeigt, wie Sie eine Liste von Dateien und Verzeichnissen erhalten, deren Namen mit „te“ beginnen:

Lassen Sie uns SPL-Iteratoren verwenden

Schauen wir uns nun die Verwendung von SPL-Iteratoren an. Aber bevor wir mit der Lösung unseres Problems beginnen, geben wir eine Einführung in die SPL-Bibliothek und die Iteratoren. Die SPL-Bibliothek bietet eine Reihe von Klassen für objektorientierte Datenstrukturen, Iteratoren, Dateideskriptoren und mehr.

Einer der Vorteile von Iteratoren besteht darin, dass es sich um Klassen handelt, die je nach Bedarf erweitert werden können. Ein weiterer Vorteil besteht darin, dass Iteratoren über eigene Methoden verfügen, die zur Lösung vieler häufiger Probleme nützlich sind und sich an einem Ort befinden. Sehen Sie sich ein Beispiel für die Verwendung von FilesystemIterator im Vergleich zu readdir() an. Beide Methoden verwenden eine Schleife, aber mit readdir() verarbeiten Sie nur einen String, während FilesystemIterator mit einem Objekt arbeitet, das zusätzliche Informationen über die Datei oder das Verzeichnis enthalten kann (Größe, Besitzer, Berechtigungen usw.).

Natürlich bietet PHP die Möglichkeit, solche Informationen mithilfe von Funktionen wie filesize() und fileowner() abzurufen. Aber PHP5 basiert auf der Verwendung des OOP-Konzepts. Daher ist es besser, moderne Methoden der Arbeit mit einer Programmiersprache zu verwenden. Auf unserer Website finden Sie Lektionen zum Arbeiten mit Iteratoren.

Wie bereits im wässrigen Teil des Tutorials erwähnt, werden wir uns mit der Verwendung von FilesystemIterator, RecursiveDirectoryIterator und GlobIterator befassen. Der erste erbt von DirectoryIterator und der Rest von FilesystemIterator . Sie haben alle denselben Konstruktor, der zwei Parameter akzeptiert:

  • $path (erforderlich): Pfad zum Dateisystemeintrag, für den Vorgänge ausgeführt werden
  • $flags (optional): ein oder mehrere in der Dokumentation aufgeführte Flags

Der eigentliche Unterschied zwischen diesen Iteratoren besteht darin, wie sie zum Navigieren entlang eines bestimmten Pfads verwendet werden.

FilesystemIterator

Die Verwendung von FilesystemIterator ist sehr einfach. Sehen wir es uns in Aktion an. Wir stellen zwei Beispiele vor. Der erste zeigt eine Suche nach allen Dateien und Verzeichnissen, deren Namen mit „te“ beginnen. Das zweite Beispiel verwendet einen anderen RegexIterator, um alle Dateien und Verzeichnisse zu finden, deren Namen mit „t.dat“ oder „t.php“ enden. Der RegexIterator wird verwendet, um das Ergebnis basierend auf regulären Ausdrücken zu filtern.

getFilename(), "te") === 0) ( $filelist = $entry->getFilename(); ) )

Der obige Code erzeugt ein ähnliches Ergebnis wie die vorherigen Beispiele.

Zweites Beispiel mit RegexIterator:

getFilename(); )

Es wird ausgegeben:

Array (0 => „script.php“, 1 => „test.dat“)

RecursiveDirectoryIterator

Der RecursiveDirectoryIterator bietet eine Schnittstelle zum rekursiven Durchlaufen von Dateisystemverzeichnissen. Es verfügt über mehrere nützliche Methoden wie getChildren() und hasChildren(), die einen Iterator für den aktuellen Speicherort zurückgeben, wenn es sich um ein Verzeichnis handelt, und prüfen, ob der aktuelle Einstiegspunkt ein Verzeichnis ist. Das folgende Beispiel demonstriert die Verwendung von RecursiveDirectoryIterator und getChildren() . Das Ergebnis wird das gleiche sein wie in den vorherigen Beispielen.

getChildren(), "/t\.(php|dat)$/"); $filelist = array(); foreach($filter as $entry) ( $filelist = $entry->getFilename(); )

GlobIterator

Der GlobIterator durchläuft das Dateisystem auf die gleiche Weise wie die Funktion glob(). Der erste Parameter kann eine Vorlage für den Namen enthalten. Das Beispiel demonstriert die Verwendung von GlobIterator mit dem gleichen Ergebnis wie zuvor.

getFilename(); )

Abschluss

Diese Lektion demonstriert die Verwendung verschiedener Ansätze, um dasselbe Ziel zu erreichen: das Abrufen einer Liste von Dateien und Verzeichnissen. Folgende Kernpunkte sollten beachtet werden:

  • Die Funktion glob() ist eine integrierte Lösung, aber nicht flexibel genug.
  • Eine auf opendir() , readdir() und closeir() basierende Lösung ist komplexer und erfordert zusätzliche Filterung, ist aber flexibler.
  • Die Funktion scandir() erfordert zusätzliche Filterung, funktioniert aber ohne Verarbeitung des Handles.
  • Wenn Sie einen OOP-Ansatz verwenden, sollten Sie die SPL-Bibliothek verwenden. Darüber hinaus können Sie Klassen um Ihre eigene Funktionalität erweitern.
  • Der GlobIterator verfügt über eine Vorfilterfunktion, während andere RegexIterator verwenden.

Reg.ru: Domains und Hosting

Der größte Registrar und Hosting-Anbieter in Russland.

Mehr als 2 Millionen Domainnamen im Einsatz.

Werbung, Domain-Mail, Geschäftslösungen.

Mehr als 700.000 Kunden auf der ganzen Welt haben bereits ihre Wahl getroffen.

*Bewegen Sie die Maus darüber, um das Scrollen anzuhalten.

Zurück Vorwärts

Abrufen einer Ordnerliste mit PHP

Auflisten von Verzeichnissen mit PHP oder Auflisten von Verzeichnissen

Wir nennen Verzeichnisliste eine allgemeine Abfrage, die eine Liste aller oder einiger Dateien und Verzeichnisse des übergeordneten Verzeichnisses generiert – ein Vorgang, der der Arbeit der Indexseite ähnelt, die von den meisten Webservern bereitgestellt wird, jedoch mit O Größere Kontrolle über den Inhalt und die Formatierung desselben.

Ein weiterer Vorteil dieses Skripts ist die Möglichkeit, bestimmte Aktionen mit Dateien mithilfe von PHP auszuführen. In jedem Fall müssen wir als Erstes das Dateisystem abfragen und eine Liste der Dateien und Verzeichnisse zurückgeben.

Mit den unten dargestellten Funktionen können Sie Dateinamen und andere Eigenschaften aus einem bestimmten Verzeichnis extrahieren oder Unterkategorien rekursiv durchlaufen.

Kommentar: PHP5 hat eine Funktion scandir, das „eine Liste von Dateien und Verzeichnissen innerhalb eines Verzeichnisses unter einem bestimmten Pfad zurückgibt“, aber keine zusätzlichen Informationen über die Dateien im Verzeichnis anzeigt.

Ein Verzeichnis auflisten

Hier ist zunächst ein Beispiel für eine einfache Funktion, die eine Liste von Dateien, Verzeichnissen und deren Eigenschaften aus einem Verzeichnis zurückgibt (fortgeschrittenere Versionen dieser Funktion finden Sie etwas später in dieser Lektion).

read())) ( // versteckte Dateien überspringen if($entry == ".") continue; if(is_dir("$dir$entry")) ( $retval = array("name" => "$dir$ enter/", "size" => 0, "lastmod" => filemtime("$dir$entry")); ) elseif(is_readable("$dir$entry")) ( $retval = array("name" = > "$dir$entry", "size" => filesize("$dir$entry"), "lastmod" => filemtime("$dir$entry") ) ) $d->close();

return $retval;

) ?>

Sie können diese Funktion wie folgt verwenden:

Der Rückgabewert ist ein assoziatives Array von Dateien, einschließlich der Pfadinformationen, der Größe und des letzten Änderungsdatums der Datei, es sei denn, die Datei ist ein Verzeichnis. In diesem Fall wird die Zeichenfolge „(dir)“ anstelle der Dateigröße angezeigt."; /* Beispielausgabe Array ( => Array ( => images/background0.jpg => image/jpeg => 86920 => 1077461701) => ...) */ ?>

Beispiel 2:

Der Rückgabewert ist ein assoziatives Array von Dateien, einschließlich der Pfadinformationen, der Größe und des letzten Änderungsdatums der Datei, es sei denn, die Datei ist ein Verzeichnis. In diesem Fall wird die Zeichenfolge „(dir)“ anstelle der Dateigröße angezeigt."; /* Beispielausgabe Array ( => Array ( => ./images/background0.jpg => image/jpeg => 86920 => 1077461701) => ...) */ ?>

Auflisten von Dateien über HTML

Um die Ausgabeergebnisse auf der Seite in HTML zu erhalten, durchlaufen wir das zurückgegebene Array

\n"; echo " NameTypGrößeLetzter Mod.\n"; foreach($dirlist as $file) ( echo " \n"; echo " ($file["name"])\n"; echo " ($file["type"])\n"; echo " ($file["size"])\n"; echo " \n"; echo "\n"; ) echo "\n\n"; ?>

Dieser Code lässt sich ganz einfach ändern, zum Beispiel:

  • - Anzeige der Auflistungsergebnisse als Liste statt als Tabelle;
  • - Dateinamen zu aktiven Links machen;
  • - Namen durch Symbole ersetzen, je nachdem, um welchen Dateityp es sich handelt;
  • usw.

Um beispielsweise nur PNG-Dateien auszugeben, fügen Sie der Ausgabeschleife eine einfache Bedingung hinzu:

\n"; echo " NameTypGrößeLetzter Mod.\n"; foreach($dirlist as $file) ( //überprüfen, ob die Datei ein PNG ist if(!preg_match("/\.png$/", $file["name"])) continue; echo " \n"; echo " ($file["name"])\n"; echo " ($file["type"])\n"; echo " ($file["size"])\n"; echo " ",date("r", $file["lastmod"]),"\n"; echo "\n"; ) echo "\n\n"; ?>

In diesem Beispiel werden alle Dateien übersprungen und ausgeblendet, deren Namen mit enden .png. Sie können auch zusätzliche Bedingungen anwenden, die auf dem Dateityp, der Größe oder dem Datum der letzten Änderung basieren.

Wenn Sie beispielsweise ein Miniaturbild, einen Link zu einem größeren Bild oder sogar ein Video anzeigen möchten, geben Sie diesen beiden Dateien einfach den gleichen Namen und verwenden Sie ihn im obigen Skript str_replace oder eine ähnliche Funktion, um den Inhalt von Links zu ändern.

Rekursive Verzeichnisliste

Und da wir so weit gekommen sind, wird es nur geringfügige Änderungen an der rekursiven Listen- und Unterkategorie-Aufruffunktion geben. Durch das Hinzufügen eines zweiten Parameters zur Funktion behalten wir die bisherige Funktionalität der Auflistung eines einzelnen Verzeichnisses bei.

read())) ( // versteckte Dateien überspringen if($entry == ".") continue; if(is_dir("$dir$entry")) ( $retval = array("name" => "$dir$ enter/", "size" => 0, "lastmod" => filemtime("$dir$entry")); if($recurse && is_readable("$dir$entry/")) ( $retval = array_merge($ retval, getFileList("$dir$entry/", true) ) elseif(is_readable("$dir$entry")) ( $retval = array("name" => "$dir$entry", "size " => filesize("$dir$entry"), "lastmod" => filemtime("$dir$entry") ) ) $d->close();

return $retval; ) ?> Damit die neue Funktionalität funktioniert, müssen Sie einen Wert eingeben

Überprüfen Sie vor der Rekursion des Skripts, ob die Unterverzeichnisse lesbar sind und lesen Sie auch den letzten Absatz dieser Lektion, um Zugriffsfehler zu vermeiden.

Der Rückgabewert ist wie zuvor ein Array, ein assoziatives Array. Tatsächlich handelt es sich bei der einzigen Ergänzung um eine weitere zusätzliche Option für die rekursive Auflistung.

Rekursionstiefenbegrenzung

Dieses letzte Beispiel fügt eine weitere Funktion hinzu – die Möglichkeit anzugeben, wie „tief“ die Rekursion gehen soll. Der vorherige Code durchsucht weiterhin Unterverzeichnisse, bis diese erschöpft sind. Dieses Skript hilft Ihnen dabei, die Anzahl der Ebenen verschachtelter Verzeichnisse zu begrenzen.

read())) ( // versteckte Dateien überspringen if($entry == ".") continue; if(is_dir("$dir$entry")) ( $retval = array("name" => "$dir$ enter/", "size" => 0, "lastmod" => filemtime("$dir$entry")); if($recurse && is_readable("$dir$entry/")) ( if($ Depth == = false) ( $retval = array_merge($retval, getFileList("$dir$entry/", true)); ) elseif($ Depth > 0) ( $retval = array_merge($retval, getFileList("$dir$entry /", true, $ Depth-1)); ) ) ) elseif(is_readable("$dir$entry")) ( $retval = array("name" => "$dir$entry", "size" => filesize("$dir$entry"), "lastmod" => filemtime("$dir$entry") ) ) $d->close();

return $retval; FALSCH) ?>