Хорошо, что на этот вопрос ответили ниже, прежде чем он был отмечен как дубликат. Ответы ниже намного лучше, чем связанный ответ на вопрос. Плюс вопрос другой, этот вопрос просит очистить каталог, а не удалить.
Барт Бург
1
Да, это другой вопрос, который вызвал разные ответы. Он не должен быть помечен как дубликат.
Даниэль Бингхэм
Ответы:
639
$files = glob('path/to/temp/*');// get all file namesforeach($files as $file){// iterate filesif(is_file($file))
unlink($file);// delete file}
Если вы хотите удалить «скрытые» файлы, такие как .htaccess, вы должны использовать
Также есть DirectoryIterator или DirectoryRecursiveIterator.
Евгений
6
Хотя это очевидно, я бы упомянул, что, например, 'path / to / temp / *. Txt' удалит только файлы txt и так далее.
Tertium
Это также работает для относительных путей? Допустим, полный путь - «/ var / www / html / folder_and_files_to_delete /», а скрипт удаления помещен в «/var/www/html/delete_folders_and_files.php». Могу ли я просто взять "folder_and_files_to_delete" в качестве пути?
Йоано
1
@yoano да, конечно, если относительный путь правильный.
Флёрн
Можно ли использовать glob, если в каталоге находятся десятки тысяч или сотни тысяч файлов?
Дэйв Хек,
260
Если вы хотите , чтобы удалить все из папки (включая вложенные папки) использовать эту комбинацию array_map, unlinkи glob:
Лучший ответ, спасибо. Чтобы избежать уведомлений, я бы также сделал glob("...") ?: [](PHP 5.4+), потому что для пустого каталога glob()возвращается false.
Моджуба
14
Он удаляет все файлы в текущей папке, но возвращает предупреждение для подпапок и не удаляет их.
Key-Six
2
Объединение ответов Стихозы и Моджубы:array_map('unlink', ( glob( "path/to/temp/*" ) ? glob( "path/to/temp/*" ) : array() ) );
Ewout
7
@ Ewout: Даже если мы объединим ответ Стихозы и Муджубы, так как ваш запрос возвращает то же самое предупреждение для подпапок, но не удаляет их
Это прекрасно работает, когда у вас нет SSH-доступа, а FTP рекурсивно удаляет множество файлов и папок буквально часами ... с этими строками я удалил 35000 файлов менее чем за 3 секунды!
гуари
Для пользователей PHP 7.1: $ file-> getRealPath () необходимо использовать вместо $ file. В противном случае PHP выдаст вам сообщение о том, что для unlink требуется путь, а не экземпляр SplFileInfo.
Разве «DirectoryIterator» также перебирает подкаталоги? Если это так, «unlink» будет генерировать предупреждение в таких случаях. Разве тело цикла не должно больше походить на ответ Yamiko и проверять каждую запись, если это файл, перед вызовом «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);}}
Предполагая, что у вас есть папка с МНОЖЕСТВОМ файлов, которые читают их все, а затем удаляют в два этапа, это не то, что нужно. Я считаю, что наиболее эффективный способ удаления файлов - просто использовать системную команду.
Например на Linux я использую:
exec('rm -f '. $absolutePathToFolder .'*');
Или это, если вы хотите рекурсивное удаление без необходимости писать рекурсивную функцию
exec('rm -f -r '. $absolutePathToFolder .'*');
точно такие же команды существуют для любой ОС, поддерживаемой PHP. Имейте в виду, что это ИСПОЛНИТЕЛЬНЫЙ способ удаления файлов. $ absolutePathToFolder ДОЛЖЕН быть проверен и защищен перед запуском этого кода, и разрешения должны быть предоставлены.
Немного небезопасно, используя этот метод, если $absolutePatToFolderон вообще пуст
Лоуренс Чероне
@LawrenceCherone Являются ли другие альтернативы более безопасными?
robsch
3
@LawrenceCherone Я надеюсь, что в настоящее время никто не запускает php с правами root. Серьезно, я ожидаю, что вход будет "безопасным", как и все вышеперечисленные функции.
Дарио Корно
Решения, получившие наибольшее количество голосов, не работают в средах разработки, где www или www-данные не являются собственниками. Администратор сервера должен убедиться, что установлены правильные права на папку. exec - это бесценный инструмент для достижения цели, с большой силой и т. д. stackoverflow.com/a/2765171/418974
Кристиан Бонато,
@LawrenceCherone вы совершенно правы, мой ответ был предназначен для очень конкретной ситуации, просто из соображений производительности. Модифицировал мой ответ согласно вашим заметкам.
Дарио Корно
8
Простой и лучший способ удалить все файлы из папки в PHP
$files = glob('my_folder/*');//get all file namesforeach($files as $file){if(is_file($file))
unlink($file);//delete file}
Функция unlinkr рекурсивно удаляет все папки и файлы по указанному пути, следя за тем, чтобы не удалять сам скрипт.
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);}}}
если вы хотите удалить все файлы и папки, в которые вы помещаете этот скрипт, то назовите его следующим образом
//get current working directory
$dir = getcwd();
unlinkr($dir);
если вы хотите просто удалить только php-файлы, называйте это следующим образом
unlinkr($dir,"*.php");
Вы также можете использовать любой другой путь для удаления файлов
unlinkr("/home/user/temp");
Это удалит все файлы в каталоге home / user / temp.
Опубликован класс обработки файлов и папок общего назначения для копирования, перемещения, удаления, вычисления размера и т. Д., Который может обрабатывать один файл или набор папок.
Там есть пакет под названием "Пушех". Используя его, вы можете очистить каталог или полностью удалить каталог ( ссылка на Github ). Он также доступен на Packagist .
Например, если вы хотите очистить Tempкаталог, вы можете сделать:
Pusheh::clearDir("Temp");// Or you can remove the directory completelyPusheh::removeDirRecursively("Temp");
Ответы:
Если вы хотите удалить «скрытые» файлы, такие как .htaccess, вы должны использовать
источник
Если вы хотите , чтобы удалить все из папки (включая вложенные папки) использовать эту комбинацию
array_map
,unlink
иglob
:Этот вызов также может обрабатывать пустые каталоги (спасибо за подсказку, @mojuba!)
источник
glob("...") ?: []
(PHP 5.4+), потому что для пустого каталогаglob()
возвращаетсяfalse
.array_map('unlink', ( glob( "path/to/temp/*" ) ? glob( "path/to/temp/*" ) : array() ) );
Вот более современный подход с использованием стандартной библиотеки PHP (SPL) .
источник
источник
Этот код с http://php.net/unlink :
источник
источник
См READDIR и Разорвать связь .
источник
Предполагая, что у вас есть папка с МНОЖЕСТВОМ файлов, которые читают их все, а затем удаляют в два этапа, это не то, что нужно. Я считаю, что наиболее эффективный способ удаления файлов - просто использовать системную команду.
Например на Linux я использую:
Или это, если вы хотите рекурсивное удаление без необходимости писать рекурсивную функцию
точно такие же команды существуют для любой ОС, поддерживаемой PHP. Имейте в виду, что это ИСПОЛНИТЕЛЬНЫЙ способ удаления файлов. $ absolutePathToFolder ДОЛЖЕН быть проверен и защищен перед запуском этого кода, и разрешения должны быть предоставлены.
источник
$absolutePatToFolder
он вообще пустПростой и лучший способ удалить все файлы из папки в PHP
Получил этот исходный код отсюда - http://www.codexworld.com/delete-all-files-from-folder-using-php/
источник
Другое решение: этот класс удаляет все файлы, подкаталоги и файлы в подкаталогах.
источник
Функция unlinkr рекурсивно удаляет все папки и файлы по указанному пути, следя за тем, чтобы не удалять сам скрипт.
если вы хотите удалить все файлы и папки, в которые вы помещаете этот скрипт, то назовите его следующим образом
если вы хотите просто удалить только php-файлы, называйте это следующим образом
Вы также можете использовать любой другой путь для удаления файлов
Это удалит все файлы в каталоге home / user / temp.
источник
Опубликован класс обработки файлов и папок общего назначения для копирования, перемещения, удаления, вычисления размера и т. Д., Который может обрабатывать один файл или набор папок.
https://gist.github.com/4689551
Использовать:
Чтобы скопировать (или переместить) отдельный файл или набор папок / файлов:
Удалить один файл или все файлы и папки в пути:
Рассчитайте размер отдельного файла или набора файлов в наборе папок:
источник
источник
Для меня решение
readdir
было лучшим и работало как шарм. Приglob
некоторых функциях функция не выполнялась.источник
Я обновил ответ @Stichoza, чтобы удалить файлы через подпапки.
источник
источник
Там есть пакет под названием "Пушех". Используя его, вы можете очистить каталог или полностью удалить каталог ( ссылка на Github ). Он также доступен на Packagist .
Например, если вы хотите очистить
Temp
каталог, вы можете сделать:Если вам интересно, посмотрите вики .
источник