Misalnya saya punya folder bernama `Temp 'dan saya ingin menghapus atau menghapus semua file dari folder ini menggunakan PHP. Bisakah saya melakukan ini?
Untung pertanyaan ini dijawab di bawah sebelum ditandai sebagai duplikat. Jawaban di bawah ini jauh lebih baik daripada pertanyaan yang ditautkan terkait. Ditambah pertanyaannya berbeda, pertanyaan ini meminta untuk mengosongkan direktori, bukan menghapus.
Bart Burg
1
Ya, ini pertanyaan berbeda yang menarik jawaban berbeda. Seharusnya tidak ditandai sebagai duplikat.
Daniel Bingham
Jawaban:
639
$files = glob('path/to/temp/*');// get all file namesforeach($files as $file){// iterate filesif(is_file($file))
unlink($file);// delete file}
Jika Anda ingin menghapus file 'tersembunyi' seperti .htaccess, Anda harus menggunakannya
Juga ada DirectoryIterator atau DirectoryRecursiveIterator.
Eugene
6
Meskipun sudah jelas, saya akan menyebutkan bahwa, misalnya, 'path / to / temp / *. Txt' hanya akan menghapus file txt dan sebagainya.
Tertium
Apakah ini juga berfungsi untuk jalur relatif? Jadi katakanlah path lengkapnya adalah "/ var / www / html / folder_and_files_to_delete /" Dan skrip penghapusan ditempatkan di "/var/www/html/delete_folders_and_files.php". Bisakah saya mengambil "folder_and_files_to_delete" sebagai path?
yoano
1
@yoano ya tentu, selama jalur relatifnya benar.
Floern
Apakah glob boleh digunakan jika direktori memiliki puluhan ribu atau ratusan ribu file di dalamnya?
Dave Heq
260
Jika Anda ingin menghapus semuanya dari folder (termasuk subfolder) gunakan kombinasi ini array_map, unlinkdan glob:
Jawaban terbaik, terima kasih. Untuk menghindari pemberitahuan saya juga akan melakukannya glob("...") ?: [](PHP 5.4+) karena untuk glob()mengembalikan direktori kosongfalse .
mojuba
14
Ini menghapus semua file di folder saat ini, tetapi mengembalikan peringatan untuk subfolder dan tidak menghapusnya.
@Ewout: Sekalipun kita menggabungkan jawaban Stichoza dan Moujuba saat pemberian Anda mengembalikan peringatan yang sama untuk subfolder dan tidak menghapusnya
Ini bekerja dengan baik, ketika Anda tidak memiliki akses SSH dan FTP membutuhkan waktu berjam - jam untuk menghapus banyak file dan folder secara rekursif ... dengan baris-baris itu saya menghapus 35000 file dalam waktu kurang dari 3 detik!
guari
Untuk pengguna PHP 7.1: $ file-> getRealPath () harus digunakan daripada $ file. Jika tidak, PHP akan memberi Anda kesalahan yang mengatakan bahwa membatalkan tautan memerlukan jalur, bukan turunan dari SplFileInfo.
Bukankah 'DirectoryIterator' juga beralih pada subdirektori? Jika demikian, batalkan tautan yang akan menghasilkan peringatan dalam kasus seperti itu. Tidakkah seharusnya badan loop terlihat lebih seperti dalam jawaban Yamiko dan memeriksa setiap entri apakah itu file sebelum memanggil 'putuskan tautan'?
/**
* 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);}}
Dengan asumsi Anda memiliki folder dengan BANYAK file membaca semuanya dan kemudian menghapus dalam dua langkah tidak berkinerja baik. Saya percaya cara paling berkinerja untuk menghapus file adalah dengan hanya menggunakan perintah sistem.
Sebagai contoh di linux saya menggunakan:
exec('rm -f '. $absolutePathToFolder .'*');
Atau ini jika Anda ingin penghapusan rekursif tanpa perlu menulis fungsi rekursif
exec('rm -f -r '. $absolutePathToFolder .'*');
perintah persis yang sama ada untuk OS apa pun yang didukung oleh PHP. Ingatlah ini adalah cara PERFORMING menghapus file. $ absolutePathToFolder HARUS diperiksa dan diamankan sebelum menjalankan kode ini dan izin harus diberikan.
Agak tidak aman menggunakan metode ini, jika $absolutePatToFolderpernah kosong
Lawrence Cherone
@LawrenceCherone Apakah alternatif lain lebih aman?
robsch
3
@LawrenceCherone Saya harap tidak ada yang menjalankan php dengan izin root saat ini. Menjadi serius, saya berharap input menjadi "aman", karena semua fungsi di atas.
Dario Corno
Solusi yang paling banyak dipilih tidak bekerja di lingkungan pengembang yang tidak memiliki pemilik atau www-data. Terserah admin server untuk memastikan hak folder tersebut diatur dengan benar. exec adalah alat yang sangat berharga untuk menyelesaikan sesuatu, dan dengan kekuatan besar, dll. stackoverflow.com/a/2765171/418974
Christian Bonato
@LawrenceCherone Anda benar-benar benar jawaban saya dimaksudkan untuk situasi yang sangat spesifik, hanya untuk alasan kinerja Dimodifikasi jawaban saya sesuai dengan catatan Anda.
Dario Corno
8
Cara sederhana dan terbaik untuk menghapus semua file dari folder di PHP
$files = glob('my_folder/*');//get all file namesforeach($files as $file){if(is_file($file))
unlink($file);//delete file}
fungsi unlinkr menghapus semua folder dan file di jalur yang diberikan secara rekursif dengan memastikan tidak menghapus skrip itu sendiri.
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);}}}
jika Anda ingin menghapus semua file dan folder tempat Anda menempatkan skrip ini, panggil sebagai berikut
//get current working directory
$dir = getcwd();
unlinkr($dir);
jika Anda hanya ingin menghapus hanya file php lalu panggil sebagai berikut
unlinkr($dir,"*.php");
Anda dapat menggunakan jalur lain untuk menghapus file juga
unlinkr("/home/user/temp");
Ini akan menghapus semua file di direktori home / user / temp.
Diposting file tujuan umum dan kelas penanganan folder untuk menyalin, memindahkan, menghapus, menghitung ukuran, dll., Yang dapat menangani satu file atau satu set folder.
Ada paket yang disebut "Pusheh". Dengan menggunakannya, Anda dapat menghapus direktori atau menghapus direktori sepenuhnya ( tautan Github ). Ini tersedia di Packagist , juga.
Misalnya, jika Anda ingin menghapus Tempdirektori, Anda dapat melakukan:
Pusheh::clearDir("Temp");// Or you can remove the directory completelyPusheh::removeDirRecursively("Temp");
Jawaban:
Jika Anda ingin menghapus file 'tersembunyi' seperti .htaccess, Anda harus menggunakannya
sumber
Jika Anda ingin menghapus semuanya dari folder (termasuk subfolder) gunakan kombinasi ini
array_map
,unlink
danglob
:Panggilan ini juga dapat menangani direktori kosong (terima kasih atas tipnya, @mojuba!)
sumber
glob("...") ?: []
(PHP 5.4+) karena untukglob()
mengembalikan direktori kosongfalse
.array_map('unlink', ( glob( "path/to/temp/*" ) ? glob( "path/to/temp/*" ) : array() ) );
Berikut ini adalah pendekatan yang lebih modern menggunakan Perpustakaan PHP Standar (SPL) .
sumber
sumber
Kode ini dari http://php.net/unlink :
sumber
sumber
Lihat readdir dan putuskan tautan .
sumber
Dengan asumsi Anda memiliki folder dengan BANYAK file membaca semuanya dan kemudian menghapus dalam dua langkah tidak berkinerja baik. Saya percaya cara paling berkinerja untuk menghapus file adalah dengan hanya menggunakan perintah sistem.
Sebagai contoh di linux saya menggunakan:
Atau ini jika Anda ingin penghapusan rekursif tanpa perlu menulis fungsi rekursif
perintah persis yang sama ada untuk OS apa pun yang didukung oleh PHP. Ingatlah ini adalah cara PERFORMING menghapus file. $ absolutePathToFolder HARUS diperiksa dan diamankan sebelum menjalankan kode ini dan izin harus diberikan.
sumber
$absolutePatToFolder
pernah kosongCara sederhana dan terbaik untuk menghapus semua file dari folder di PHP
Dapatkan kode sumber ini dari sini - http://www.codexworld.com/delete-all-files-from-folder-using-php/
sumber
Solusi lain: Kelas ini menghapus semua file, subdirektori dan file di sub direktori.
sumber
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
Diposting file tujuan umum dan kelas penanganan folder untuk menyalin, memindahkan, menghapus, menghitung ukuran, dll., Yang dapat menangani satu file atau satu set folder.
https://gist.github.com/4689551
Menggunakan:
Untuk menyalin (atau memindahkan) satu file atau satu set folder / file:
Hapus satu file atau semua file dan folder di jalur:
Hitung ukuran satu file atau satu set file dalam satu set folder:
sumber
sumber
Bagi saya, solusi dengan
readdir
yang terbaik dan bekerja seperti pesona. Denganglob
, fungsi gagal dengan beberapa skenario.sumber
Saya memperbarui jawaban @Stichoza untuk menghapus file melalui subfolder.
sumber
sumber
Ada paket yang disebut "Pusheh". Dengan menggunakannya, Anda dapat menghapus direktori atau menghapus direktori sepenuhnya ( tautan Github ). Ini tersedia di Packagist , juga.
Misalnya, jika Anda ingin menghapus
Temp
direktori, Anda dapat melakukan:Jika Anda tertarik, lihat wiki .
sumber