Hanya ingin diperhatikan. Saya membuat banyak file dan jika selama proses mendapatkan beberapa kesalahan, maka perlu menghapus file yang dibuat sebelumnya. Saat membuat file, lupa menggunakan fclose($create_file);dan ketika menghapus, didapat Warning: unlink(created_file.xml): Permission denied in.... Jadi untuk menghindari kesalahan tersebut harus menutup file yang dibuat.
Sebelum menghapus folder, hapus semua file dan foldernya (dan ini berarti rekursi!). Berikut ini sebuah contoh:
publicstaticfunction deleteDir($dirPath){if(! is_dir($dirPath)){thrownewInvalidArgumentException("$dirPath must be a directory");}if(substr($dirPath, strlen($dirPath)-1,1)!='/'){
$dirPath .='/';}
$files = glob($dirPath .'*', GLOB_MARK);foreach($files as $file){if(is_dir($file)){self::deleteDir($file);}else{
unlink($file);}}
rmdir($dirPath);}
Dan jika Anda menggunakan 5.2+ Anda dapat menggunakan RecursiveIterator untuk melakukannya tanpa menerapkan rekursi sendiri:
Implementasi kedua Anda agak berbahaya: tidak memeriksa titik ( .dan ..) dan menghapus jalur yang diselesaikan, bukan yang sebenarnya.
Alix Axel
9
sedikit add-on :-) glob () tidak mendukung file seperti .htaccess. Saya menggunakan fungsi ini untuk menghapus direktori yang dibuat oleh KCFinder (plugin CKEditor) yang menghasilkan .htaccess dan .thumbs (file + folder). Sebaliknya saya menggunakan scandirfungsi untuk mendapatkan daftar folder. Pastikan Anda memfilter '.' dan file '..' dari daftar hasil.
Joshua - Pendo
25
DIRECTORY_SEPARATOR tidak diperlukan saat Anda sedang membangun jalur untuk dikirim ke os. Windows akan menerima garis miring juga. Ini terutama berguna untuk explode()jalur yang diambil dari OS. alanhogan.com/tips/php/directory-separator-not-n perlu
ReactiveRaven
5
Selain @Alix Axel Menggunakan di sini [SplFileInfo :: getRealPath ()] ( php.net/manual/en/splfileinfo.getrealpath.php ) bukan ide yang baik. Metode ini memperluas semua tautan simbolik, yang berarti, akan menghapus file asli dari suatu tempat, bukan symlink dari direktori target. Anda harus menggunakan SplFileInfo :: getPathname () sebagai gantinya.
Vijit
2
Saya setuju dengan @Vijit, gunakan getPathname () alih-alih getRealPath (). Ia melakukan hal yang sama tanpa menghapus lebih dari yang Anda harapkan jika symlink ditemukan.
JoeMoe1984
196
Saya biasanya menggunakan ini untuk menghapus semua file dalam folder:
Ini tidak menghapus folder secara rekursif; itu hanya berfungsi jika folder hanya memiliki file biasa di dalamnya, yang semuanya memiliki ekstensi file.
mgnb
5
Jika tidak diperlukan rekursi, ini adalah jawaban terbaik dan paling sederhana sejauh ini. Terima kasih!
eisbehr
2
Untuk menghapus semua file dari folder, tidak hanya yang memiliki ekstensi, gunakan glob dengan cara berikut: array_map('unlink', glob("$dirname/*"));Ini masih tidak memungkinkan Anda untuk menghapus direktori yang bersarang di folder.
kremuwa
Perhatikan bahwa ini juga akan menghapus file titik (tersembunyi).
BadHorsie
85
apa cara termudah untuk menghapus direktori dengan semua file di dalamnya?
Saya harap kamu tidak serius. Apa yang terjadi jika $ dir adalah /
Pengembang Pixel
108
@ Sama persis dengan salah satu kode di atas. Bukan?
Akal Sehat Anda
7
Perhatikan bahwa, tergantung bagaimana $dirdihasilkan / disediakan, Anda mungkin perlu melakukan beberapa pra-pemrosesan tambahan agar aman dan menghindari bug. Misalnya, jika $dirmungkin memiliki ruang yang tidak luput atau semi-kolon di dalamnya, maka mungkin ada efek samping yang tidak diinginkan. Ini tidak terjadi dengan jawaban yang menggunakan hal-hal seperti rmdir()karena itu akan menangani karakter khusus untuk Anda.
Trott
5
Versi Windows:system('rmdir '.escapeshellarg($path).' /s /q');
Cypher
2
@ThePixelDeveloper Anda tidak perlu khawatir tentang menghapus /, ini hanya akan bekerja jika Anda akan lounch script di command line sebagai root, karena di web semuanya terjadi sebagai pengguna apache
Ben
49
Fungsi pendek yang melakukan pekerjaan:
function deleteDir($path){return is_file($path)?@unlink($path):
array_map(__FUNCTION__, glob($path.'/*'))==@rmdir($path);}
Dengan kekuatan besar datang tanggung jawab besar : Ketika Anda memanggil fungsi ini dengan nilai kosong, itu akan menghapus file mulai dari root ( /). Sebagai perlindungan, Anda dapat memeriksa apakah path kosong:
function deleteDir($path){if(empty($path)){returnfalse;}return is_file($path)?@unlink($path):
array_map(__FUNCTION__, glob($path.'/*'))==@rmdir($path);}
Yang statis tidak berfungsi karena $ this === NULL ketika Anda memanggil fungsi statis di kelas. Ini akan berhasil jika$this_func = array(__CLASS__, __FUNCTION__);
Matt Connolly
2
Bisakah seseorang menjelaskan kalimatnya array_map($class_func, glob($path.'/*')) == @rmdir($path)? Saya kira dia berulang melalui subfolder, tapi apa yang dilakukan bagian == @rmdir? Bagaimana <array booleans> == <boolean> mengembalikan jawabannya? Apakah ini memeriksa apakah setiap nilai pengembalian rekursi sama dengan boolean di sebelah kanan?
arviman
2
Ini adalah trik untuk menggabungkan dua pernyataan menjadi satu pernyataan. Ini karena operator ternary hanya mengizinkan satu pernyataan per argumen. array_map(...)menghapus semua file dalam direktori, @rmdir(...)menghapus direktori itu sendiri.
Blaise
3
Hati-hati! Fungsi ini tidak memeriksa apakah path benar-benar ada. Jika Anda melewatkan argumen kosong, fungsi akan mulai menghapus file mulai dari root! Tambahkan cek kewarasan ke jalur Anda sebelum Anda menjalankan fungsi ini.
Tatu Ulmanen
3
Beberapa orang tidak melihat komentar Tatu dan dihapus secara rekursif /, jadi saya menambahkan versi yang dilindungi ke posting saya.
Blaise
22
Seperti yang terlihat di komentar paling banyak pada halaman manual PHP tentang rmdir()(lihat http://php.net/manual/es/function.rmdir.php ), glob()fungsi tidak mengembalikan file tersembunyi. scandir()disediakan sebagai alternatif yang memecahkan masalah itu.
Algoritma yang dijelaskan di sana (yang bekerja seperti mantra dalam kasus saya) adalah:
<?php
function delTree($dir){
$files = array_diff(scandir($dir), array('.','..'));foreach($files as $file){(is_dir("$dir/$file"))? delTree("$dir/$file"): unlink("$dir/$file");}return rmdir($dir);}?>
bisakah Anda jelaskan is_dir ("$ dir / $ file") - tidak memenuhi parameter "$ dir / $ file"
Igor L.
Maksud kamu apa? Ia memeriksa apakah entri yang ditemukan di direktori ( $file) adalah direktori atau file. "$dir/$file"sama dengan $dir . "/" . $file.
Latorre Jerman
Jujur saya tidak tahu Anda dapat menggabungkan variabel seperti ini :) thx
Namun saya tidak bisa menghapus beberapa struktur direktori kompleks dengan metode ini, jadi pertama-tama Anda harus mencobanya untuk memastikan itu berfungsi dengan baik.
Saya bisa menghapus struktur direktori tersebut menggunakan implementasi spesifik Windows:
$dir = strtr($dir,'/','\\');// quotes are important, otherwise one could// delete "foo" instead of "foo bar"
system('RMDIR /S /Q "'.$dir.'"');
Dan hanya demi kelengkapan, berikut ini adalah kode lama saya:
function xrmdir($dir){
$items = scandir($dir);foreach($items as $item){if($item ==='.'|| $item ==='..'){continue;}
$path = $dir.'/'.$item;if(is_dir($path)){
xrmdir($path);}else{
unlink($path);}}
rmdir($dir);}
function my_folder_delete($path){if(!empty($path)&& is_dir($path)){
$dir =newRecursiveDirectoryIterator($path,RecursiveDirectoryIterator::SKIP_DOTS);//upper dirs are not included,otherwise DISASTER HAPPENS :)
$files =newRecursiveIteratorIterator($dir,RecursiveIteratorIterator::CHILD_FIRST);foreach($files as $f){if(is_file($f)){unlink($f);}else{$empty_dirs[]= $f;}}if(!empty($empty_dirs)){foreach($empty_dirs as $eachDir){rmdir($eachDir);}} rmdir($path);}}
ps INGAT! jangan berikan NILAI KOSONG ke fungsi penghapusan Direktori apa pun !!! (Cadangkan selalu, jika tidak suatu hari Anda mungkin akan BENCANA !!)
/*
* Remove the directory and its content (all files and subdirectories).
* @param string $dir the directory name
*/function rmrf($dir){foreach(glob($dir)as $file){if(is_dir($file)){
rmrf("$file/*");
rmdir($file);}else{
unlink($file);}}}
Saya lebih suka ini karena masih mengembalikan BENAR ketika berhasil dan SALAH ketika gagal, dan itu juga mencegah bug di mana jalan kosong mungkin mencoba dan menghapus semuanya dari '/ *' !!:
function deleteDir($path){return!empty($path)&& is_file($path)?@unlink($path):(array_reduce(glob($path.'/*'),function($r, $i){return $r && deleteDir($i);}, TRUE))&&@rmdir($path);}
Saya ingin memperluas jawaban oleh @alcuadrado dengan komentar oleh @Vijit untuk menangani symlink. Pertama, gunakan getRealPath (). Tetapi kemudian, jika Anda memiliki symlink yang merupakan folder, ia akan gagal karena akan mencoba dan memanggil rmdir pada tautan - jadi Anda perlu pemeriksaan tambahan.
$it =newRecursiveDirectoryIterator($dir,RecursiveDirectoryIterator::SKIP_DOTS);
$files =newRecursiveIteratorIterator($it,RecursiveIteratorIterator::CHILD_FIRST);foreach($files as $file){if($file->isLink()){
unlink($file->getPathname());}elseif($file->isDir()){
rmdir($file->getPathname());}else{
unlink($file->getPathname());}}
rmdir($dir);
Sedikit litle memodifikasi kode alcuadrado - globjangan melihat file dengan nama dari titik seperti .htaccessjadi saya menggunakan skandir dan skrip menghapus sendiri - centang __FILE__.
function deleteDir($dirPath){if(!is_dir($dirPath)){thrownewInvalidArgumentException("$dirPath must be a directory");}if(substr($dirPath, strlen($dirPath)-1,1)!='/'){
$dirPath .='/';}
$files = scandir($dirPath);foreach($files as $file){if($file ==='.'|| $file ==='..')continue;if(is_dir($dirPath.$file)){
deleteDir($dirPath.$file);}else{if($dirPath.$file !== __FILE__){
unlink($dirPath.$file);}}}
rmdir($dirPath);}
Saya biasanya ingin menambahkan cek kewarasan pada $ cache_folder sebelum menjalankan rm -rf untuk menghindari kesalahan yang mahal
glyph
1
Hapus semua file di Folder array_map('unlink', glob("$directory/*.*"));
Hapus semua. * - File di Folder (tanpa: "." Dan "..") array_map('unlink', array_diff(glob("$directory/.*),array("$directory/.","$directory/..")))
Sekarang hapus Folder itu sendiri rmdir($directory)
2 sen untuk ditambahkan ke jawaban INI di atas, yang merupakan BTW yang bagus
Setelah fungsi gumpalan Anda (atau yang serupa) memindai / membaca direktori, tambahkan persyaratan untuk memeriksa respons tidak kosong, atau invalid argument supplied for foreach()peringatan akan dilemparkan. Begitu...
if(! empty( $files )){foreach( $files as $file ){// do your stuff here...}}
Fungsi lengkap saya (sebagai metode objek):
privatefunction recursiveRemoveDirectory( $directory ){if(! is_dir( $directory )){thrownewInvalidArgumentException("$directory must be a directory");}if( substr( $directory, strlen( $directory )-1,1)!='/'){
$directory .='/';}
$files = glob( $directory ."*");if(! empty( $files )){foreach( $files as $file ){if( is_dir( $file )){
$this->recursiveRemoveDirectory( $file );}else{
unlink( $file );}}}
rmdir( $directory );}// END recursiveRemoveDirectory()
$ direktori (string) - untuk dihapus secara rekursif.
$ options (array) - untuk penghapusan direktori. Opsi yang valid adalah: traverseSymlinks: boolean, apakah symlink ke direktori juga harus dilalui. Defaults to false, artinya konten direktori yang disinkronkan tidak akan dihapus. Hanya symlink yang akan dihapus dalam kasus default itu.
Seperti solusi Playnox, tetapi dengan DirectoryIterator bawaan yang elegan:
function delete_directory($dirPath){if(is_dir($dirPath)){
$objects=newDirectoryIterator($dirPath);foreach($objects as $object){if(!$object->isDot()){if($object->isDir()){
delete_directory($object->getPathname());}else{
unlink($object->getPathname());}}}
rmdir($dirPath);}else{thrownewException(__FUNCTION__.'(dirPath): dirPath is not a directory!');}}
fclose($create_file);
dan ketika menghapus, didapatWarning: unlink(created_file.xml): Permission denied in...
. Jadi untuk menghindari kesalahan tersebut harus menutup file yang dibuat.Jawaban:
Setidaknya ada dua opsi yang tersedia saat ini.
Sebelum menghapus folder, hapus semua file dan foldernya (dan ini berarti rekursi!). Berikut ini sebuah contoh:
Dan jika Anda menggunakan 5.2+ Anda dapat menggunakan RecursiveIterator untuk melakukannya tanpa menerapkan rekursi sendiri:
sumber
.
dan..
) dan menghapus jalur yang diselesaikan, bukan yang sebenarnya.scandir
fungsi untuk mendapatkan daftar folder. Pastikan Anda memfilter '.' dan file '..' dari daftar hasil.explode()
jalur yang diambil dari OS. alanhogan.com/tips/php/directory-separator-not-n perluSaya biasanya menggunakan ini untuk menghapus semua file dalam folder:
Dan kemudian Anda bisa melakukannya
sumber
array_map('unlink', glob("$dirname/*"));
Ini masih tidak memungkinkan Anda untuk menghapus direktori yang bersarang di folder.sumber
$dir
dihasilkan / disediakan, Anda mungkin perlu melakukan beberapa pra-pemrosesan tambahan agar aman dan menghindari bug. Misalnya, jika$dir
mungkin memiliki ruang yang tidak luput atau semi-kolon di dalamnya, maka mungkin ada efek samping yang tidak diinginkan. Ini tidak terjadi dengan jawaban yang menggunakan hal-hal sepertirmdir()
karena itu akan menangani karakter khusus untuk Anda.system('rmdir '.escapeshellarg($path).' /s /q');
Fungsi pendek yang melakukan pekerjaan:
Saya menggunakannya di kelas Utils seperti ini:
Dengan kekuatan besar datang tanggung jawab besar : Ketika Anda memanggil fungsi ini dengan nilai kosong, itu akan menghapus file mulai dari root (
/
). Sebagai perlindungan, Anda dapat memeriksa apakah path kosong:sumber
$this_func = array(__CLASS__, __FUNCTION__);
array_map($class_func, glob($path.'/*')) == @rmdir($path)
? Saya kira dia berulang melalui subfolder, tapi apa yang dilakukan bagian == @rmdir? Bagaimana <array booleans> == <boolean> mengembalikan jawabannya? Apakah ini memeriksa apakah setiap nilai pengembalian rekursi sama dengan boolean di sebelah kanan?array_map(...)
menghapus semua file dalam direktori,@rmdir(...)
menghapus direktori itu sendiri./
, jadi saya menambahkan versi yang dilindungi ke posting saya.Seperti yang terlihat di komentar paling banyak pada halaman manual PHP tentang
rmdir()
(lihat http://php.net/manual/es/function.rmdir.php ),glob()
fungsi tidak mengembalikan file tersembunyi.scandir()
disediakan sebagai alternatif yang memecahkan masalah itu.Algoritma yang dijelaskan di sana (yang bekerja seperti mantra dalam kasus saya) adalah:
sumber
$file
) adalah direktori atau file."$dir/$file"
sama dengan$dir . "/" . $file
.Ini adalah versi yang lebih pendek
sumber
Anda dapat menggunakan Filesystem ( kode ) Symfony :
Namun saya tidak bisa menghapus beberapa struktur direktori kompleks dengan metode ini, jadi pertama-tama Anda harus mencobanya untuk memastikan itu berfungsi dengan baik.
Saya bisa menghapus struktur direktori tersebut menggunakan implementasi spesifik Windows:
Dan hanya demi kelengkapan, berikut ini adalah kode lama saya:
sumber
Di sini Anda memiliki satu rekursi yang bagus dan sederhana untuk menghapus semua file dalam direktori sumber termasuk direktori itu:
Fungsi didasarkan pada rekursi yang dibuat untuk menyalin direktori. Anda dapat menemukan fungsi itu di sini: Salin seluruh isi direktori ke direktori lain menggunakan php
sumber
Solusi Terbaik untuk saya
kode:
ps INGAT!
jangan berikan NILAI KOSONG ke fungsi penghapusan Direktori apa pun !!! (Cadangkan selalu, jika tidak suatu hari Anda mungkin akan BENCANA !!)
sumber
Bagaimana dengan ini:
sumber
Fungsi Glob tidak mengembalikan file yang disembunyikan, oleh karena itu scandir dapat lebih berguna, ketika mencoba menghapus pohon secara rekursif.
sumber
Anda dapat mencoba sebagai berikut:
sumber
Saya lebih suka ini karena masih mengembalikan BENAR ketika berhasil dan SALAH ketika gagal, dan itu juga mencegah bug di mana jalan kosong mungkin mencoba dan menghapus semuanya dari '/ *' !!:
sumber
Saya ingin memperluas jawaban oleh @alcuadrado dengan komentar oleh @Vijit untuk menangani symlink. Pertama, gunakan getRealPath (). Tetapi kemudian, jika Anda memiliki symlink yang merupakan folder, ia akan gagal karena akan mencoba dan memanggil rmdir pada tautan - jadi Anda perlu pemeriksaan tambahan.
sumber
Menggunakan DirectoryIterator setara dengan jawaban sebelumnya ...
sumber
Yang ini bekerja untuk saya:
sumber
Sesuatu seperti ini?
sumber
Sedikit litle memodifikasi kode alcuadrado -
glob
jangan melihat file dengan nama dari titik seperti.htaccess
jadi saya menggunakan skandir dan skrip menghapus sendiri - centang__FILE__
.sumber
Contoh untuk server Linux:
exec('rm -f -r ' . $cache_folder . '/*');
sumber
Hapus semua file di Folder
array_map('unlink', glob("$directory/*.*"));
Hapus semua. * - File di Folder (tanpa: "." Dan "..")
array_map('unlink', array_diff(glob("$directory/.*),array("$directory/.","$directory/..")))
Sekarang hapus Folder itu sendiri
rmdir($directory)
sumber
2 sen untuk ditambahkan ke jawaban INI di atas, yang merupakan BTW yang bagus
Setelah fungsi gumpalan Anda (atau yang serupa) memindai / membaca direktori, tambahkan persyaratan untuk memeriksa respons tidak kosong, atau
invalid argument supplied for foreach()
peringatan akan dilemparkan. Begitu...Fungsi lengkap saya (sebagai metode objek):
sumber
Inilah solusi yang berfungsi sempurna:
sumber
Anda bisa menyalin pembantu YII
$ direktori (string) - untuk dihapus secara rekursif.
$ options (array) - untuk penghapusan direktori. Opsi yang valid adalah: traverseSymlinks: boolean, apakah symlink ke direktori juga harus dilalui. Defaults to
false
, artinya konten direktori yang disinkronkan tidak akan dihapus. Hanya symlink yang akan dihapus dalam kasus default itu.sumber
Sudahkah Anda mencoba kode obove dari php.net
Bekerja untukku baik-baik saja
sumber
Untuk windows:
sumber
Seperti solusi Playnox, tetapi dengan DirectoryIterator bawaan yang elegan:
sumber
Saya tidak ingat dari mana saya menyalin fungsi ini, tetapi sepertinya itu tidak terdaftar dan berfungsi untuk saya
sumber
Sederhana dan Mudah ...
sumber
Bagaimana dengan ini?
Refrence: https://paulund.co.uk/php-delete-directory-and-files-in-directory
sumber
Jika Anda tidak yakin, Jalur yang diberikan adalah direktori atau file, maka Anda dapat menggunakan fungsi ini untuk menghapus jalur
sumber