Start · Sprachen · PHP · Referenz · Directory

Directory

Klasse

Repräsentiert ein geöffnetes Verzeichnis und bietet objektorientierte Methoden zum Lesen und Schließen von Verzeichniseinträgen.

seit PHP 4.0.0 Kategorie: io

Signatur

class Directory

Beschreibung

Die Klasse Directory wird nicht direkt über new Directory() instanziiert, sondern ausschließlich durch den Aufruf der Funktion dir(). Sie kapselt einen Verzeichnis-Handle und stellt zwei Methoden bereit: read() zum schrittweisen Auslesen von Einträgen sowie close() zum Freigeben des Handles.

Ein Directory-Objekt verhält sich funktional ähnlich wie die prozeduralen Funktionen opendir(), readdir() und closedir(), bietet aber eine sauberere, objektorientierte Schnittstelle. Die Eigenschaft path enthält den Pfad des geöffneten Verzeichnisses, während handle den zugrunde liegenden Ressource-Handle hält, der auch mit den prozeduralen Verzeichnisfunktionen verwendet werden kann.

Typische Anwendungsfälle sind das Iterieren über Verzeichnisinhalte, das Filtern von Dateien nach Erweiterung oder das Traversieren von Verzeichnisstrukturen. Für komplexere Traversierungen ist alternativ die Klasse RecursiveDirectoryIterator aus der SPL zu empfehlen.

Beispiele

Alle Einträge eines Verzeichnisses auflisten

<?php
$dir = dir('/var/www/html');

if ($dir === false) {
    echo 'Verzeichnis konnte nicht geöffnet werden.';
    exit;
}

echo 'Pfad: ' . $dir->path . PHP_EOL;

while (($entry = $dir->read()) !== false) {
    echo $entry . PHP_EOL;
}

$dir->close();
Pfad: /var/www/html . .. index.php css js

Nur PHP-Dateien in einem Verzeichnis filtern

<?php
$dir = dir(__DIR__);

if ($dir === false) {
    throw new RuntimeException('Verzeichnis konnte nicht geöffnet werden.');
}

$phpFiles = [];

while (($entry = $dir->read()) !== false) {
    if (pathinfo($entry, PATHINFO_EXTENSION) === 'php') {
        $phpFiles[] = $entry;
    }
}

$dir->close();

echo 'PHP-Dateien gefunden: ' . count($phpFiles) . PHP_EOL;
foreach ($phpFiles as $file) {
    echo '  - ' . $file . PHP_EOL;
}
PHP-Dateien gefunden: 2 - index.php - config.php

Handle-Eigenschaft mit prozeduralen Funktionen kombinieren

<?php
$dir = dir('/tmp');

if ($dir === false) {
    exit('Fehler beim Öffnen.');
}

// Handle kann auch mit prozeduralen Funktionen genutzt werden
rewinddir($dir->handle);

while (($entry = readdir($dir->handle)) !== false) {
    if ($entry !== '.' && $entry !== '..') {
        echo $entry . PHP_EOL;
    }
}

$dir->close();

// Wichtig · Fallstricke

Instanziierung: Die Klasse Directory darf niemals mit new Directory() erzeugt werden — ausschließlich dir() liefert eine gültige Instanz. Bei einem Fehler gibt dir() false zurück, daher sollte stets eine Prüfung erfolgen.

Ressourcen freigeben: close() sollte immer aufgerufen werden, wenn das Verzeichnis nicht mehr benötigt wird, um den Datei-Handle zu schließen und Ressourcen freizugeben. Alternativ wird der Handle beim Zerstören des Objekts automatisch geschlossen.

Einträge . und ..: read() gibt auch die speziellen Einträge . (aktuelles Verzeichnis) und .. (übergeordnetes Verzeichnis) zurück. Diese müssen bei der Verarbeitung in der Regel explizit herausgefiltert werden.

Tipp: Für tiefere Verzeichnis-Traversierungen empfiehlt sich die SPL-Klasse RecursiveDirectoryIterator in Kombination mit RecursiveIteratorIterator.