Dobrze, że na pytanie to udzielono odpowiedzi poniżej, zanim oznaczono je jako duplikat. Poniższe odpowiedzi są znacznie lepsze niż połączone pytanie, na które udzielono odpowiedzi. Ponadto pytanie jest inne, pytanie to wymaga opróżnienia katalogu, a nie usunięcia.
Bart Burg
1
Tak, to jest inne pytanie, które wyciągnęło różne odpowiedzi. Nie powinien być oznaczony jako duplikat.
Daniel Bingham
Odpowiedzi:
638
$files = glob('path/to/temp/*');// get all file namesforeach($files as $file){// iterate filesif(is_file($file))
unlink($file);// delete file}
Jeśli chcesz usunąć „ukryte” pliki, takie jak .htaccess, musisz użyć
Istnieje również DirectoryIterator lub DirectoryRecursiveIterator.
Eugene
6
Chociaż jest to oczywiste, wspomnę, że na przykład „ścieżka / do / temp / *. Txt” usunie tylko pliki txt i tak dalej.
Tertium
Czy to działa również w przypadku ścieżek względnych? Powiedzmy, że pełna ścieżka to „/ var / www / html / folder_and_files_to_delete /” A skrypt usuwania jest umieszczony w „/var/www/html/delete_folders_and_files.php”. Czy mogę po prostu potraktować „folder_i_plików_do_kasowania” jako ścieżkę?
yoano
1
@yoano tak, na pewno, o ile ścieżka względna jest poprawna.
Floern
Czy glob jest w porządku, jeśli katalog zawiera dziesiątki tysięcy lub setki tysięcy plików?
Dave Heq,
260
Jeśli chcesz usunąć wszystko z folderu (w tym podfolderów) korzystać z tej kombinacji array_map, unlinka glob:
Działa to ładnie, gdy nie masz dostępu do SSH, a FTP zajmuje dosłownie godziny rekurencyjne usuwanie wielu plików i folderów ... za pomocą tych linii usunąłem 35000 plików w mniej niż 3 sekundy!
guari
Dla użytkowników PHP 7.1: $ file-> getRealPath () musi być użyte zamiast $ file. W przeciwnym razie PHP wyświetli błąd informujący, że unlink wymaga ścieżki, a nie wystąpienia SplFileInfo.
Czy „DirectoryIterator” również nie przechodzi do podkatalogów? Jeśli tak, „rozłącz” wygeneruje ostrzeżenie w takich przypadkach. Czy treść pętli nie powinna wyglądać bardziej jak w odpowiedzi Yamiko i sprawdzać każdy wpis, czy jest to plik przed wywołaniem „unlink”?
/**
* 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);}}
Zakładając, że masz folder z DUŻĄ liczbą plików, które je wszystkie odczytują, a następnie usuwanie w dwóch krokach nie jest tak skuteczne. Uważam, że najbardziej skutecznym sposobem usuwania plików jest po prostu użycie polecenia systemowego.
Na przykład w systemie Linux używam:
exec('rm -f '. $absolutePathToFolder .'*');
Lub to, jeśli chcesz usunąć rekurencyjne bez potrzeby pisania funkcji rekurencyjnej
exec('rm -f -r '. $absolutePathToFolder .'*');
te same dokładne polecenia istnieją dla każdego systemu operacyjnego obsługiwanego przez PHP. Pamiętaj, że jest to WYDAJNY sposób usuwania plików. $ absolutPathToFolder MUSI być sprawdzony i zabezpieczony przed uruchomieniem tego kodu, a uprawnienia muszą zostać przyznane.
Niebezpieczne przy użyciu tej metody, jeśli $absolutePatToFolderkiedykolwiek jest puste
Lawrence Cherone
@LawrenceCherone Czy inne alternatywy są bardziej bezpieczne?
robsch
3
@LawrenceCherone Mam nadzieję, że w dzisiejszych czasach nikt nie używa php z uprawnieniami roota. Mówiąc poważnie, oczekuję, że dane wejściowe będą „bezpieczne”, ponieważ wszystkie powyższe funkcje.
Dario Corno,
Najczęściej wybierane rozwiązania nie działają w środowiskach programistycznych, w których www lub www-data nie jest właścicielem. Administrator serwera musi upewnić się, że są ustawione odpowiednie prawa do folderu. exec jest nieocenionym narzędziem do wykonywania zadań, z wielką mocą itp. stackoverflow.com/a/2765171/418974
Christian Bonato
@LawrenceCherone masz całkowitą rację, moja odpowiedź była przeznaczona dla bardzo konkretnej sytuacji, tylko ze względu na wydajność. Zmodyfikowałem moją odpowiedź zgodnie z twoimi notatkami.
Dario Corno,
8
Prosty i najlepszy sposób na usunięcie wszystkich plików z folderu w PHP
$files = glob('my_folder/*');//get all file namesforeach($files as $file){if(is_file($file))
unlink($file);//delete file}
Funkcja unlinkr rekurencyjnie usuwa wszystkie foldery i pliki w podanej ścieżce, upewniając się, że nie usuwa samego skryptu.
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);}}}
jeśli chcesz usunąć wszystkie pliki i foldery, w których umieścisz ten skrypt, wywołaj go w następujący sposób
//get current working directory
$dir = getcwd();
unlinkr($dir);
jeśli chcesz po prostu usunąć tylko pliki php, nazwij to w następujący sposób
unlinkr($dir,"*.php");
możesz również użyć dowolnej innej ścieżki, aby usunąć pliki
unlinkr("/home/user/temp");
Spowoduje to usunięcie wszystkich plików w katalogu home / user / temp.
Wysłano klasę obsługi plików i folderów ogólnego przeznaczenia do kopiowania, przenoszenia, usuwania, obliczania rozmiaru itp., Która może obsługiwać pojedynczy plik lub zestaw folderów.
Istnieje pakiet o nazwie „Pusheh”. Za jego pomocą możesz wyczyścić katalog lub całkowicie go usunąć ( link Github ). Jest również dostępny na Packagist .
Na przykład, jeśli chcesz wyczyścić Tempkatalog, możesz:
Pusheh::clearDir("Temp");// Or you can remove the directory completelyPusheh::removeDirRecursively("Temp");
Odpowiedzi:
Jeśli chcesz usunąć „ukryte” pliki, takie jak .htaccess, musisz użyć
źródło
Jeśli chcesz usunąć wszystko z folderu (w tym podfolderów) korzystać z tej kombinacji
array_map
,unlink
aglob
:To wywołanie może również obsługiwać puste katalogi (dzięki za wskazówkę, @mojuba!)
źródło
glob("...") ?: []
(PHP 5.4+), ponieważglob()
zwraca pusty katalogfalse
.array_map('unlink', ( glob( "path/to/temp/*" ) ? glob( "path/to/temp/*" ) : array() ) );
Oto bardziej nowoczesne podejście przy użyciu Standardowej Biblioteki PHP (SPL) .
źródło
źródło
Ten kod z http://php.net/unlink :
źródło
źródło
Zobacz readdir i odłącz .
źródło
Zakładając, że masz folder z DUŻĄ liczbą plików, które je wszystkie odczytują, a następnie usuwanie w dwóch krokach nie jest tak skuteczne. Uważam, że najbardziej skutecznym sposobem usuwania plików jest po prostu użycie polecenia systemowego.
Na przykład w systemie Linux używam:
Lub to, jeśli chcesz usunąć rekurencyjne bez potrzeby pisania funkcji rekurencyjnej
te same dokładne polecenia istnieją dla każdego systemu operacyjnego obsługiwanego przez PHP. Pamiętaj, że jest to WYDAJNY sposób usuwania plików. $ absolutPathToFolder MUSI być sprawdzony i zabezpieczony przed uruchomieniem tego kodu, a uprawnienia muszą zostać przyznane.
źródło
$absolutePatToFolder
kiedykolwiek jest pusteProsty i najlepszy sposób na usunięcie wszystkich plików z folderu w PHP
Mam ten kod źródłowy stąd - http://www.codexworld.com/delete-all-files-from-folder-using-php/
źródło
Inne rozwiązanie: ta klasa usuwa wszystkie pliki, podkatalogi i pliki z podkatalogów.
źródło
Funkcja unlinkr rekurencyjnie usuwa wszystkie foldery i pliki w podanej ścieżce, upewniając się, że nie usuwa samego skryptu.
jeśli chcesz usunąć wszystkie pliki i foldery, w których umieścisz ten skrypt, wywołaj go w następujący sposób
jeśli chcesz po prostu usunąć tylko pliki php, nazwij to w następujący sposób
możesz również użyć dowolnej innej ścieżki, aby usunąć pliki
Spowoduje to usunięcie wszystkich plików w katalogu home / user / temp.
źródło
Wysłano klasę obsługi plików i folderów ogólnego przeznaczenia do kopiowania, przenoszenia, usuwania, obliczania rozmiaru itp., Która może obsługiwać pojedynczy plik lub zestaw folderów.
https://gist.github.com/4689551
Używać:
Aby skopiować (lub przenieść) pojedynczy plik lub zestaw folderów / plików:
Usuń pojedynczy plik lub wszystkie pliki i foldery ze ścieżki:
Oblicz rozmiar pojedynczego pliku lub zestawu plików w zestawie folderów:
źródło
źródło
Dla mnie rozwiązanie, które
readdir
było najlepsze, działało jak urok. Wglob
przypadku niektórych scenariuszy funkcja nie działała.źródło
Zaktualizowałem odpowiedź @Stichoza, aby usunąć pliki przez podfoldery.
źródło
źródło
Istnieje pakiet o nazwie „Pusheh”. Za jego pomocą możesz wyczyścić katalog lub całkowicie go usunąć ( link Github ). Jest również dostępny na Packagist .
Na przykład, jeśli chcesz wyczyścić
Temp
katalog, możesz:Jeśli jesteś zainteresowany, zobacz wiki .
źródło