Ein komplettes Verzeichnis ist mit der in PHP implementierten Funktion copy() schnell kopiert. Wer aber häufig mit Verzeichnissen arbeitet wird vielleicht auf ein Problem stoßen: Man will nur den Inhalt eines Verzeichnisses kopieren, nicht aber das Verzeichnis selbst!

Ich habe dieses Problem mit der in PHP implementierten Klasse dir gelöst, die Funktion muss aufgrund der Unterverzeichnisse natürlich rekursiv arbeiten!

function copy_base( $source, $target )
{
if ( is_dir( $source ) ) #prüfen, ob es sich um ein verzeichnis handelt
{
@mkdir( $target ); # Zielverzeichnis erstellen, falls es nicht existiert

$d = dir( $source ); # Verzeichnis in die php-klasse dir einlesen
#(die “dir-Klassse” ist eine in php-vorinstallierte Klasse, welche nicht importiert werden muss ACHTUNG funktioniert nur in PHP 5)

while ( FALSE !== ( $entry = $d->read() ) ) # Schleife zum einlesen der einzelnen Dateien
{
if ( $entry == ‘.’ || $entry == ‘..’ ) #überspringen der Einträge . und .. (Windows spezifisch)
{
continue;
}

$Entry = $source . ‘/’ . $entry; # Jede eingelesene Datei wird mit vollständigem Pfad in $Entry gespeichert
if ( is_dir( $Entry ) ) # prüfen, ob eine Datei ein Verzeichnis ist
{
copy_base( $Entry, $target . ‘/’ . $entry ); # falls ja, rekursiver Funktionsaufruf zum Einlesen der
#Dateien im Unterverzeichnis, danach fortfahren

continue;
}
copy( $Entry, $target . ‘/’ . $entry ); # Alle eingelesenen Dateien kopieren
}

$d->close(); #mit php-klasse dir dasVerzeichnis schließen veralssen
}
else
{
copy( $source, $target ); # Datei kopieren falls es sich bei source nicht um ein Verzeichnis handelt
}
}

Ich habe die Funktion mit Kommentaren versehen, um deren Arbeitsweise zu erklären.

Bei Rückfragen einfach die Kommentarfunktion nutzen.

Hier nochmal ein Bild in Ordentlicher Form, weil man ohne Einrückung leider nicht so viel erkennt ;-)!

Edit: Der Teil andem die Einträge “.” und “..” übersprungen werden kann unter Linux natürlich entfallen.