Es ist gut, dass diese Frage unten beantwortet wurde, bevor sie als Duplikat markiert wurde. Die Antworten unten sind viel besser als die verknüpfte beantwortete Frage. Plus die Frage ist anders, diese Frage fordert, ein Verzeichnis zu leeren, nicht zu löschen.
Bart Burg
1
Ja, das ist eine andere Frage, die unterschiedliche Antworten gezogen hat. Es sollte nicht als Duplikat markiert werden.
Daniel Bingham
Antworten:
639
$files = glob('path/to/temp/*');// get all file namesforeach($files as $file){// iterate filesif(is_file($file))
unlink($file);// delete file}
Wenn Sie "versteckte" Dateien wie .htaccess entfernen möchten, müssen Sie verwenden
Es gibt auch DirectoryIterator oder DirectoryRecursiveIterator.
Eugene
6
Obwohl es offensichtlich ist, würde ich erwähnen, dass zum Beispiel 'path / to / temp / *. Txt' nur txt-Dateien entfernt und so weiter.
Tertium
Funktioniert dies auch für relative Pfade? Angenommen, der vollständige Pfad lautet "/ var / www / html / folder_and_files_to_delete /". Das Löschskript befindet sich in "/var/www/html/delete_folders_and_files.php". Kann ich einfach "folder_and_files_to_delete" als Pfad verwenden?
Yoano
1
@yoano ja sicher, solange der relative Pfad korrekt ist.
Floern
Kann glob verwendet werden, wenn das Verzeichnis Zehntausende oder Hunderttausende von Dateien enthält?
Dave Heq
260
Wenn Sie wollen , dass alles aus dem Ordner löschen (einschließlich Unterordner) verwendet diese Kombination aus array_map, unlinkund glob:
Beste Antwort, danke. Um Hinweise zu vermeiden, würde ich auch glob("...") ?: [](PHP 5.4+) tun, da für ein leeres Verzeichnis glob()zurückgegeben wird false.
Mojuba
14
Es löscht alle Dateien im aktuellen Ordner, gibt jedoch eine Warnung für Unterordner zurück und löscht sie nicht.
Key-Six
2
Kombinieren der Antworten von Stichoza und Mojuba:array_map('unlink', ( glob( "path/to/temp/*" ) ? glob( "path/to/temp/*" ) : array() ) );
Ewout
7
@Ewout: Auch wenn wir Stichozas und Moujubas Antwort kombinieren, während Ihr Geben die gleiche Warnung für Unterordner zurückgibt und sie nicht löscht
Dies funktioniert gut, wenn Sie keinen SSH-Zugriff haben und FTP buchstäblich Stunden benötigt , um viele Dateien und Ordner rekursiv zu löschen. Mit diesen Zeilen habe ich 35000 Dateien in weniger als 3 Sekunden gelöscht!
Guari
Für PHP 7.1-Benutzer muss $ file-> getRealPath () anstelle von $ file verwendet werden. Andernfalls erhalten Sie von PHP die Fehlermeldung, dass für die Aufhebung der Verknüpfung ein Pfad und keine Instanz von SplFileInfo erforderlich ist.
Wird "DirectoryIterator" nicht auch über Unterverzeichnisse iteriert? In diesem Fall würde "Verknüpfung aufheben" in solchen Fällen eine Warnung auslösen. Sollte der Körper der Schleife nicht eher wie in Yamikos Antwort aussehen und jeden Eintrag überprüfen, ob es sich um eine Datei handelt, bevor Sie "Unlink" aufrufen?
/**
* Delete a file or recursively delete a directory
*
* @param string $str Path to file or directory
*/function recursiveDelete($str){if(is_file($str)){return@unlink($str);}
elseif (is_dir($str)){
$scan = glob(rtrim($str,'/').'/*');foreach($scan as $index=>$path){
recursiveDelete($path);}return@rmdir($str);}}
Angenommen, Sie haben einen Ordner mit VIELEN Dateien, die alle lesen und dann in zwei Schritten löschen, ist nicht so leistungsfähig. Ich glaube, die leistungsstärkste Methode zum Löschen von Dateien ist die Verwendung eines Systembefehls.
Zum Beispiel unter Linux benutze ich:
exec('rm -f '. $absolutePathToFolder .'*');
Oder dies, wenn Sie eine rekursive Löschung wünschen, ohne eine rekursive Funktion schreiben zu müssen
exec('rm -f -r '. $absolutePathToFolder .'*');
Die gleichen genauen Befehle existieren für jedes von PHP unterstützte Betriebssystem. Beachten Sie, dass dies eine DURCHFÜHRENDE Methode zum Löschen von Dateien ist. $ absolutePathToFolder MUSS überprüft und gesichert werden, bevor dieser Code ausgeführt wird, und Berechtigungen müssen erteilt werden.
Etwas unsicher mit dieser Methode, wenn $absolutePatToFolderjemals leer ist
Lawrence Cherone
@LawrenceCherone Sind andere Alternativen sicherer?
Robsch
3
@LawrenceCherone Ich hoffe, dass heutzutage niemand PHP mit Root-Berechtigungen ausführt. Im Ernst, ich erwarte, dass die Eingabe "sicher" ist, da alle oben genannten Funktionen.
Dario Corno
Die am häufigsten gewählten Lösungen funktionieren nicht in Entwicklungsumgebungen, in denen www oder www-data nicht der Eigentümer ist. Es ist Sache des Serveradministrators, sicherzustellen, dass die richtigen Rechte für den Ordner festgelegt sind. exec ist ein unschätzbares Werkzeug, um Dinge zu erledigen, und mit großer Kraft usw. stackoverflow.com/a/2765171/418974
Christian Bonato
@LawrenceCherone Sie sind völlig richtig. Meine Antwort war für eine ganz bestimmte Situation gedacht, nur aus Leistungsgründen. Meine Antwort wurde gemäß Ihren Notizen geändert.
Dario Corno
8
Der einfache und beste Weg, um alle Dateien aus einem Ordner in PHP zu löschen
$files = glob('my_folder/*');//get all file namesforeach($files as $file){if(is_file($file))
unlink($file);//delete file}
Die Funktion unlinkr löscht rekursiv alle Ordner und Dateien im angegebenen Pfad, indem sichergestellt wird, dass das Skript selbst nicht gelöscht wird.
function unlinkr($dir, $pattern ="*"){// find all files and folders matching pattern
$files = glob($dir ."/$pattern");//interate thorugh the files and foldersforeach($files as $file){//if it is a directory then re-call unlinkr function to delete files inside this directory if(is_dir($file)and!in_array($file, array('..','.'))){
echo "<p>opening directory $file </p>";
unlinkr($file, $pattern);//remove the directory itself
echo "<p> deleting directory $file </p>";
rmdir($file);}elseif(is_file($file)and($file != __FILE__)){// make sure you don't delete the current script
echo "<p>deleting file $file </p>";
unlink($file);}}}
Wenn Sie alle Dateien und Ordner löschen möchten, in denen Sie dieses Skript ablegen, rufen Sie es wie folgt auf
//get current working directory
$dir = getcwd();
unlinkr($dir);
Wenn Sie nur PHP-Dateien löschen möchten, rufen Sie es wie folgt auf
unlinkr($dir,"*.php");
Sie können auch einen anderen Pfad verwenden, um die Dateien zu löschen
unlinkr("/home/user/temp");
Dadurch werden alle Dateien im Verzeichnis home / user / temp gelöscht.
Es wurde eine universelle Datei- und Ordnerbehandlungsklasse zum Kopieren, Verschieben, Löschen, Berechnen der Größe usw. veröffentlicht, die eine einzelne Datei oder eine Reihe von Ordnern verarbeiten kann.
Es gibt ein Paket namens "Pusheh". Mit ihm können Sie ein Verzeichnis löschen oder ein Verzeichnis vollständig entfernen ( Github-Link ). Es ist auch auf Packagist erhältlich .
Wenn Sie beispielsweise das TempVerzeichnis löschen möchten , können Sie Folgendes tun:
Pusheh::clearDir("Temp");// Or you can remove the directory completelyPusheh::removeDirRecursively("Temp");
Wenn Sie interessiert sind, besuchen Sie das Wiki .
Antworten:
Wenn Sie "versteckte" Dateien wie .htaccess entfernen möchten, müssen Sie verwenden
quelle
Wenn Sie wollen , dass alles aus dem Ordner löschen (einschließlich Unterordner) verwendet diese Kombination aus
array_map
,unlink
undglob
:Dieser Aufruf kann auch leere Verzeichnisse verarbeiten (danke für den Tipp, @mojuba!)
quelle
glob("...") ?: []
(PHP 5.4+) tun, da für ein leeres Verzeichnisglob()
zurückgegeben wirdfalse
.array_map('unlink', ( glob( "path/to/temp/*" ) ? glob( "path/to/temp/*" ) : array() ) );
Hier ist ein moderner Ansatz unter Verwendung der Standard PHP Library (SPL) .
quelle
quelle
Dieser Code von http://php.net/unlink :
quelle
quelle
Siehe readdir und unlink .
quelle
Angenommen, Sie haben einen Ordner mit VIELEN Dateien, die alle lesen und dann in zwei Schritten löschen, ist nicht so leistungsfähig. Ich glaube, die leistungsstärkste Methode zum Löschen von Dateien ist die Verwendung eines Systembefehls.
Zum Beispiel unter Linux benutze ich:
Oder dies, wenn Sie eine rekursive Löschung wünschen, ohne eine rekursive Funktion schreiben zu müssen
Die gleichen genauen Befehle existieren für jedes von PHP unterstützte Betriebssystem. Beachten Sie, dass dies eine DURCHFÜHRENDE Methode zum Löschen von Dateien ist. $ absolutePathToFolder MUSS überprüft und gesichert werden, bevor dieser Code ausgeführt wird, und Berechtigungen müssen erteilt werden.
quelle
$absolutePatToFolder
jemals leer istDer einfache und beste Weg, um alle Dateien aus einem Ordner in PHP zu löschen
Habe diesen Quellcode von hier bekommen - http://www.codexworld.com/delete-all-files-from-folder-using-php/
quelle
Eine andere Lösung: Diese Klasse löscht alle Dateien, Unterverzeichnisse und Dateien in den Unterverzeichnissen.
quelle
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
Es wurde eine universelle Datei- und Ordnerbehandlungsklasse zum Kopieren, Verschieben, Löschen, Berechnen der Größe usw. veröffentlicht, die eine einzelne Datei oder eine Reihe von Ordnern verarbeiten kann.
https://gist.github.com/4689551
Benutzen:
So kopieren (oder verschieben) Sie eine einzelne Datei oder eine Reihe von Ordnern / Dateien:
Löschen Sie eine einzelne Datei oder alle Dateien und Ordner in einem Pfad:
Berechnen Sie die Größe einer einzelnen Datei oder einer Reihe von Dateien in einer Reihe von Ordnern:
quelle
quelle
Für mich war die Lösung mit
readdir
am besten und wirkte wie ein Zauber. Mitglob
schlug die Funktion in einigen Szenarien fehl.quelle
Ich habe die Antwort von @Stichoza aktualisiert, um Dateien über Unterordner zu entfernen.
quelle
quelle
Es gibt ein Paket namens "Pusheh". Mit ihm können Sie ein Verzeichnis löschen oder ein Verzeichnis vollständig entfernen ( Github-Link ). Es ist auch auf Packagist erhältlich .
Wenn Sie beispielsweise das
Temp
Verzeichnis löschen möchten , können Sie Folgendes tun:Wenn Sie interessiert sind, besuchen Sie das Wiki .
quelle