Jak usunąć katalog i całą jego zawartość (pliki i podkatalogi) w PHP?
php
recursion
delete-directory
Itay Moav -Malimovka
źródło
źródło
Odpowiedzi:
Sekcja
rmdir
stworzona przez użytkowników na stronie podręcznika zawiera przyzwoitą implementację:źródło
is_dir
dwa razy dla każdego katalogu rekurencyjnego. Jeśli argument jest dowiązaniem symbolicznym, on również podąża za nim zamiast usuwać dowiązanie symboliczne, co może być tym, czego chcesz, ale nie musi. W każdym razie tak nierm -rf
jest.Opierając się na komentarzu The Pixel Developer's , fragment wykorzystujący SPL może wyglądać następująco:
Uwaga: To nie ma sprawdzania czystości i korzysta z flagą SKIP_DOTS wprowadzonego z FilesystemIterator w PHP 5.3.0. Oczywiście
$todo
może to byćif
/else
. Ważną kwestią jest to, żeCHILD_FIRST
jest używany do iteracji po elementach podrzędnych (plikach) przed ich nadrzędnymi (folderami).źródło
SKIP_DOTS
został wprowadzony tylko w PHP 5.3? Gdzie to widziałeś?getPathname()
metody zamiastgetRealPath()
?rmdir($dir)
końcu skryptu powinien znajdować się.rmdir()
iunlink()
, np. PrzerywaE_WARNING
i zwracatrue
lubfalse
wskazuje sukces.FilesystemIterator
nie jest iteratorem rekurencyjnym.Usuwa wszystkie pliki i foldery ze ścieżki.
źródło
rm -rf /
==recurseRmdir('/')
:)is_dir("$dir/$file")
nais_dir("$dir/$file") && !is_link("$dir/$file")
W przypadku * nix możesz użyć
shell_exec
forrm -R
lubDEL /S folder_name
for Windows.źródło
DEL /S folder_name
na WindowsRMDIR /S /Q folder_name
jest tym, co zadziałało dla mnieexec('rm -rf ' . __DIR__ . '/output/*.log');
źródło
Jest inny wątek z większą ilością przykładów tutaj: rekurencyjna funkcja usuwania katalogu dla PHP?
Jeśli używasz Yii, możesz zostawić to frameworkowi:
źródło
„prosty” kod, który działa i może być odczytany przez dziesięciolatka:
Zwróć uwagę, że wszystko, co zrobiłem, to rozwinięcie / uproszczenie i naprawienie (nie działało dla niepustego katalogu) rozwiązanie tutaj: W PHP jak rekurencyjnie usunąć wszystkie foldery, które nie są puste?
źródło
Ulepszone rozwiązanie @Artefacto - poprawione literówki i uproszczony kod, działające zarówno dla pustych, jak i niepustych katalogów.
źródło
W 100% działające rozwiązanie
źródło
Coś takiego?
źródło
Przykład z funkcją glob () . Będzie usuwał wszystkie pliki i foldery rekurencyjnie, w tym pliki zaczynające się od kropki.
źródło
system('rm -fr folder')
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, nazwij 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 do usunięcia plików
Spowoduje to usunięcie wszystkich plików w katalogu home / user / temp.
źródło
Używam tego kodu ...
albo ten...
źródło
Po zakończeniu testów wystarczy usunąć # z #unlink i #rmdir w klasie.
źródło
cleanup.php:
źródło
Wygląda na to, że wszystkie inne odpowiedzi zakładają, że ścieżka podana do funkcji jest zawsze katalogiem. Ten wariant działa w celu usunięcia katalogów, a także pojedynczych plików:
źródło
Prawidłowe używanie DirectoryIterator i rekurencji:
źródło
Właśnie stworzyłem ten kod na podstawie niektórych dyskusji dotyczących StackOverflow. Nie testowałem jeszcze w środowisku Linux. Ma na celu całkowite usunięcie pliku lub katalogu:
źródło
źródło
Zmodyfikowany wariant rozwiązania @XzaR. Usuwa puste foldery, gdy wszystkie pliki są z nich usuwane i zgłasza wyjątki zamiast zwracać false w przypadku błędów.
źródło
źródło
unlink
,rmdir
)opendir
+readdir
praca szybciej, żescandir
iRecursiveDirectoryIterator
to jest także zużywają mniej pamięci niż wszystkie. Aby usunąć folder, muszęclosedir
najpierw, utknąłem na tym. Dzięki tej odpowiedzi.