15 ответов:
$files = glob('path/to/temp/*'); // get all file names foreach($files as $file){ // iterate files if(is_file($file)) unlink($file); // delete file }Если вы хотите удалить "скрытые" файлы, как .htaccess, вы должны использовать
$files = glob('path/to/temp/{,.}*', GLOB_BRACE);
если вы хотите удалить все из папки (включая подпапки) используйте эту комбинацию
array_map,unlinkиglob:array_map('unlink', glob("path/to/temp/*"));обновление
этот вызов также может обрабатывать пустые каталоги-спасибо за совет, @mojuba!
array_map('unlink', array_filter((array) glob("path/to/temp/*")));
вот более современный подход с использованием стандартная библиотека PHP (SPL).
$dir = "path/to/directory"; $di = new RecursiveDirectoryIterator($dir, FilesystemIterator::SKIP_DOTS); $ri = new RecursiveIteratorIterator($di, RecursiveIteratorIterator::CHILD_FIRST); foreach ( $ri as $file ) { $file->isDir() ? rmdir($file) : unlink($file); } return true;
foreach (new DirectoryIterator('/path/to/directory') as $fileInfo) { if(!$fileInfo->isDot()) { unlink($fileInfo->getPathname()); } }
этот код от http://php.net/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 должен быть проверен и защищен перед запуском этого кода и разрешения должны быть предоставлены.
простой и лучший способ удалить все файлы из папки в PHP
$files = glob('my_folder/*'); //get all file names foreach($files as $file){ if(is_file($file)) unlink($file); //delete file }получил этот исходный код отсюда -http://www.codexworld.com/delete-all-files-from-folder-using-php/
другое решение: Этот класс удаляет все файлы, подкаталоги и файлы в подкаталогах.
class Your_Class_Name { /** * @see http://php.net/manual/de/function.array-map.php * @see http://www.php.net/manual/en/function.rmdir.php * @see http://www.php.net/manual/en/function.glob.php * @see http://php.net/manual/de/function.unlink.php * @param string $path */ public function delete($path) { if (is_dir($path)) { array_map(function($value) { $this->delete($value); rmdir($value); },glob($path . '/*', GLOB_ONLYDIR)); array_map('unlink', glob($path."/*")); } } }
функция unlinkr рекурсивно удаляет все папки и файлы в заданном пути, убедившись, что он не удаляет сам скрипт.
function unlinkr($dir, $pattern = "*") { // find all files and folders matching pattern $files = glob($dir . "/$pattern"); //interate thorugh the files and folders foreach($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); } else if(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.
размещен класс обработки файлов и папок общего назначения для копирования, перемещения, удаления, вычисления размера и т. д., который может обрабатывать один файл или набор папок.
https://gist.github.com/4689551
использование:
для копирования (или перемещения) одного файла или набора папок/файлов:
$files = new Files(); $results = $files->copyOrMove('source/folder/optional-file', 'target/path', 'target-file-name-for-single-file.only', 'copy');удалить один файл или все файлы и папки в путь:
$files = new Files(); $results = $files->delete('source/folder/optional-file.name');рассчитать размер одного файла или набора файлов в набор папок:
$files = new Files(); $results = $files->calculateSize('source/folder/optional-file.name');
для меня, решение с
readdirбыл лучше и работал как шарм. Сglob, функция не работает с некоторыми сценариями.// Remove a directory recursively function removeDirectory($dirPath) { if (! is_dir($dirPath)) { return false; } if (substr($dirPath, strlen($dirPath) - 1, 1) != '/') { $dirPath .= '/'; } if ($handle = opendir($dirPath)) { while (false !== ($sub = readdir($handle))) { if ($sub != "." && $sub != ".." && $sub != "Thumb.db") { $file = $dirPath . $sub; if (is_dir($file)) { removeDirectory($file); } else { unlink($file); } } } closedir($handle); } rmdir($dirPath); }
я обновил ответ @Stichoza, чтобы удалить файлы через подпапки.
function glob_recursive($pattern, $flags = 0) { $fileList = glob($pattern, $flags); foreach (glob(dirname($pattern).'/*', GLOB_ONLYDIR|GLOB_NOSORT) as $dir) { $subPattern = $dir.'/'.basename($pattern); $subFileList = glob_recursive($subPattern, $flags); $fileList = array_merge($fileList, $subFileList); } return $fileList; } function glob_recursive_unlink($pattern, $flags = 0) { array_map('unlink', glob_recursive($pattern, $flags)); }
<? //delete all files from folder & sub folders function listFolderFiles($dir) { $ffs = scandir($dir); echo '<ol>'; foreach ($ffs as $ff) { if ($ff != '.' && $ff != '..') { if (file_exists("$dir/$ff")) { unlink("$dir/$ff"); } echo '<li>' . $ff; if (is_dir($dir . '/' . $ff)) { listFolderFiles($dir . '/' . $ff); } echo '</li>'; } } echo '</ol>'; } $arr = array( "folder1", "folder2" ); for ($x = 0; $x < count($arr); $x++) { $mm = $arr[$x]; listFolderFiles($mm); } //end ?>
Comments