Bagaimana cara saya menghapus direktori dan seluruh isinya (file dan subdirektori) di PHP?
php
recursion
delete-directory
Itay Moav -Malimovka
sumber
sumber
Jawaban:
Bagian kontribusi pengguna di halaman manual
rmdir
berisi implementasi yang layak:sumber
is_dir
dua kali untuk setiap direktori berulang. Jika argumennya adalah symlink, ia juga mengikutinya alih-alih menghapus symlink, yang mungkin atau mungkin bukan yang Anda inginkan. Bagaimanapun, bukan itu yangrm -rf
terjadi.Berdasarkan komentar Pengembang Pixel , cuplikan menggunakan SPL mungkin terlihat seperti:
Catatan: Itu tidak ada pengecekan kewarasan dan membuat penggunaan bendera SKIP_DOTS diperkenalkan dengan FilesystemIterator di PHP 5.3.0. Tentu saja, itu
$todo
bisa menjadiif
/else
. Poin penting adalah yangCHILD_FIRST
digunakan untuk beralih pada anak-anak (file) terlebih dahulu sebelum orang tua mereka (folder).sumber
SKIP_DOTS
hanya diperkenalkan di PHP 5.3? Di mana Anda melihat itu?getPathname()
metode ini alih-alihgetRealPath()
?rmdir($dir)
di akhir skrip.rmdir()
danunlink()
, misalnya dibatalkan denganE_WARNING
dan kembalitrue
ataufalse
menunjukkan keberhasilan.FilesystemIterator
itu bukan iterator rekursif.Menghapus semua file dan folder di jalur.
sumber
rm -rf /
==recurseRmdir('/')
:)is_dir("$dir/$file")
keis_dir("$dir/$file") && !is_link("$dir/$file")
Untuk * nix Anda dapat menggunakan
shell_exec
forrm -R
atauDEL /S folder_name
untuk Windows.sumber
DEL /S folder_name
untuk WindowsRMDIR /S /Q folder_name
adalah yang bekerja untuk sayaexec('rm -rf ' . __DIR__ . '/output/*.log');
sumber
Ada utas lain dengan lebih banyak contoh di sini: Fungsi direktori hapus rekursif untuk PHP?
Jika Anda menggunakan Yii maka Anda dapat membiarkannya pada framework:
sumber
kode 'sederhana' yang berfungsi dan dapat dibaca oleh anak berumur sepuluh tahun:
Harap dicatat bahwa semua yang saya lakukan adalah memperluas / menyederhanakan dan memperbaiki (tidak berfungsi untuk direktori yang tidak kosong) solusinya di sini: Di PHP bagaimana cara menghapus semua folder yang tidak kosong secara rekursif?
sumber
Solusi @Artefacto yang disempurnakan - kesalahan ketik yang diperbaiki dan kode yang disederhanakan, bekerja untuk direktori kosong && tidak kosong.
sumber
Solusi kerja 100%
sumber
Sesuatu seperti ini?
sumber
Contoh dengan fungsi glob () . Ini akan menghapus semua file dan folder secara rekursif, termasuk file yang dimulai dengan titik.
sumber
system('rm -fr folder')
fungsi unlinkr menghapus semua folder dan file di jalur yang diberikan secara rekursif dengan memastikan tidak menghapus skrip itu sendiri.
jika Anda ingin menghapus semua file dan folder tempat Anda menempatkan skrip ini, panggil sebagai berikut
jika Anda hanya ingin menghapus hanya file php lalu panggil sebagai berikut
Anda dapat menggunakan jalur lain untuk menghapus file juga
Ini akan menghapus semua file di direktori home / user / temp.
sumber
Saya menggunakan kode ini ...
atau yang ini ...
sumber
Setelah Anda selesai menjalankan tes, hapus # dari #unlink dan #rmdir di kelas.
sumber
cleanup.php:
sumber
Tampaknya semua jawaban lain menganggap jalur yang diberikan ke fungsi selalu berupa direktori. Varian ini berfungsi untuk menghapus direktori dan juga file tunggal:
sumber
Menggunakan DirectoryIterator dan rekursi dengan benar:
sumber
Saya baru saja membuat kode ini, dari beberapa diskusi StackOverflow. Saya belum menguji lingkungan Linux. Itu dibuat untuk menghapus file atau direktori, sepenuhnya:
sumber
sumber
Varian yang dimodifikasi dari solusi @XzaR. Itu menghapus folder kosong, ketika semua file dihapus dari mereka dan itu melempar pengecualian daripada mengembalikan kesalahan palsu.
sumber
sumber
unlink
,rmdir
)opendir
+readdir
bekerja lebih cepatscandir
danRecursiveDirectoryIterator
juga menggunakan lebih sedikit memori daripada semua. Untuk menghapus folder saya harusclosedir
terlebih dahulu, saya terjebak pada ini. Terima kasih atas jawaban ini.