Wie lösche ich ein Verzeichnis und seinen gesamten Inhalt (Dateien und Unterverzeichnisse) in PHP?
php
recursion
delete-directory
Itay Moav-Malimovka
quelle
quelle
Antworten:
Der vom Benutzer bereitgestellte Abschnitt auf der Handbuchseite von
rmdir
enthält eine anständige Implementierung:quelle
is_dir
zweimal für jedes rekursive Verzeichnis auf. Wenn das Argument ein Symlink ist, folgt es ihm auch, anstatt den Symlink zu löschen, der möglicherweise das ist, was Sie wollen oder nicht. Auf jeden Fall ist es nicht das, wasrm -rf
tut.Aufbauend auf dem Kommentar des Pixel-Entwicklers könnte ein Ausschnitt mit der SPL folgendermaßen aussehen:
Hinweis: Es wird keine Überprüfung der Integrität durchgeführt und das mit dem FilesystemIterator in PHP 5.3.0 eingeführte Flag SKIP_DOTS verwendet. Natürlich
$todo
könnte das einif
/ seinelse
. Der wichtige Punkt ist, dassCHILD_FIRST
die untergeordneten Elemente (Dateien) zuerst vor den übergeordneten Elementen (Ordnern) durchlaufen werden.quelle
SKIP_DOTS
wurde nur in PHP 5.3 eingeführt? Wo hast du das gesehen?getPathname()
Methode anstelle von verwendengetRealPath()
?rmdir($dir)
am Ende des Skripts stehen.rmdir()
undunlink()
z. B. abgebrochenE_WARNING
und zurückgegebentrue
oderfalse
Erfolg angezeigt .FilesystemIterator
ist kein rekursiver Iterator.Löscht alle Dateien und Ordner im Pfad.
quelle
rm -rf /
==recurseRmdir('/')
:)is_dir("$dir/$file")
zuis_dir("$dir/$file") && !is_link("$dir/$file")
Für * nix können Sie ein
shell_exec
fürrm -R
oderDEL /S folder_name
für Windows verwenden.quelle
DEL /S folder_name
WindowsRMDIR /S /Q folder_name
hat für mich funktioniertexec('rm -rf ' . __DIR__ . '/output/*.log');
quelle
Hier gibt es einen weiteren Thread mit weiteren Beispielen: Eine rekursive Funktion zum Entfernen von Verzeichnissen für PHP?
Wenn Sie Yii verwenden, können Sie es dem Framework überlassen:
quelle
'einfacher' Code, der funktioniert und von einem Zehnjährigen gelesen werden kann:
Bitte beachten Sie, dass ich die Lösung hier nur erweitert / vereinfacht und korrigiert habe (funktionierte nicht für nicht leere Verzeichnisse): Wie entferne ich in PHP rekursiv alle Ordner, die nicht leer sind?
quelle
Verbesserte @ Artefacto-Lösung - korrigierte Tippfehler und vereinfachter Code, die für beide funktionieren - leere und nicht leere Verzeichnisse.
quelle
Die 100% funktionierende Lösung
quelle
Etwas wie das?
quelle
Beispiel mit der Funktion glob () . Alle Dateien und Ordner werden rekursiv gelöscht, einschließlich Dateien, die mit dot beginnen.
quelle
system('rm -fr folder')
Die Funktion unlinkr löscht rekursiv alle Ordner und Dateien im angegebenen Pfad, indem sichergestellt wird, dass das Skript selbst nicht gelöscht wird.
Wenn Sie alle Dateien und Ordner löschen möchten, in denen Sie dieses Skript ablegen, rufen Sie es wie folgt auf
Wenn Sie nur PHP-Dateien löschen möchten, rufen Sie es wie folgt auf
Sie können auch einen anderen Pfad verwenden, um die Dateien zu löschen
Dadurch werden alle Dateien im Verzeichnis home / user / temp gelöscht.
quelle
Ich benutze diesen Code ...
oder dieses...
quelle
Wenn Sie mit dem Ausführen der Tests fertig sind, entfernen Sie einfach # aus dem #unlink und #rmdir in der Klasse.
quelle
cleanup.php:
quelle
Es scheint, dass alle anderen Antworten davon ausgehen, dass der der Funktion zugewiesene Pfad immer ein Verzeichnis ist. Diese Variante entfernt Verzeichnisse sowie einzelne Dateien:
quelle
DirectoryIterator und Rekursion korrekt verwenden:
quelle
Ich habe diesen Code aus einigen StackOverflow-Diskussionen erstellt. Ich habe noch nicht in der Linux-Umgebung getestet. Es wird erstellt, um eine Datei oder ein Verzeichnis vollständig zu löschen:
quelle
quelle
Modifizierte Variante der @ XzaR-Lösung. Leere Ordner werden entfernt, wenn alle Dateien aus ihnen gelöscht wurden, und es werden Ausnahmen ausgelöst, anstatt bei Fehlern false zurückzugeben.
quelle
quelle
unlink
,rmdir
) dieopendir
+readdir
Arbeit schneller , dassscandir
undRecursiveDirectoryIterator
es auch weniger Speicher als alle zu verwenden ist. Um Ordner zu entfernen, muss ichclosedir
zuerst daran festhalten. Dank dieser Antwort.