Intereting Posts
Я не могу найти ошибку в моем php-скрипте Преобразование Mysql Timestamp во времени с момента размещения Как реализовать расширения доктрины Beberlei в zend framework 2 Очистить содержимое веб-страницы Когда мы должны сделать конструктор Private & Why? PHP Понимание объекта домена + шаблон карты данных? locale в laravel 5.4 возвращается к искомому языку после обновления Как получить дочернее имя класса из родительского класса возможно ли установить неограниченное время для файла cookie для переменной сеанса? Поиск ключа минимального значения в ассоциативном массиве Проверка массива изображений в Laravel 5 Laravel: как получить пользовательскую сортированную красноречивую коллекцию, используя метод whereIn Как определить, когда пользователь успешно завершил загрузку файла в php codeigniter, ссылающийся на другую страницу PHP – выполнить веб-скрипт как сценарий командной строки?

Рекурсивная функция удаления PHP

Я написал рекурсивную функцию PHP для удаления папки. Интересно, как мне изменить эту функцию для удаления всех файлов и папок в веб-хостинге, за исключением заданного массива файлов и имен папок (например, cgi-bin, .htaccess)?

КСТАТИ

использовать эту функцию, чтобы полностью удалить вызывающий каталог, подобный этому

recursive_remove_directory('path/to/directory/to/delete'); 

для использования этой функции для удаления каталога, вызывающего вот так:

 recursive_remove_directory('path/to/full_directory',TRUE); 

Теперь функция

 function recursive_remove_directory($directory, $empty=FALSE) { // if the path has a slash at the end we remove it here if(substr($directory,-1) == '/') { $directory = substr($directory,0,-1); } // if the path is not valid or is not a directory ... if(!file_exists($directory) || !is_dir($directory)) { // ... we return false and exit the function return FALSE; // ... if the path is not readable }elseif(!is_readable($directory)) { // ... we return false and exit the function return FALSE; // ... else if the path is readable }else{ // we open the directory $handle = opendir($directory); // and scan through the items inside while (FALSE !== ($item = readdir($handle))) { // if the filepointer is not the current directory // or the parent directory if($item != '.' && $item != '..') { // we build the new path to delete $path = $directory.'/'.$item; // if the new path is a directory if(is_dir($path)) { // we call this function with the new path recursive_remove_directory($path); // if the new path is a file }else{ // we remove the file unlink($path); } } } // close the directory closedir($handle); // if the option to empty is not set to true if($empty == FALSE) { // try to delete the now empty directory if(!rmdir($directory)) { // return false if not possible return FALSE; } } // return success return TRUE; } } 

Попробуйте что-то вроде этого:

 $it = new RecursiveIteratorIterator( new RecursiveDirectoryIterator('%yourBaseDir%'), RecursiveIteratorIterator::CHILD_FIRST ); $excludeDirsNames = array(); $excludeFileNames = array('.htaccess'); foreach($it as $entry) { if ($entry->isDir()) { if (!in_array($entry->getBasename(), $excludeDirsNames)) { try { rmdir($entry->getPathname()); } catch (Exception $ex) { // dir not empty } } } elseif (!in_array($entry->getFileName(), $excludeFileNames)) { unlink($entry->getPathname()); } } 

Я использую эту функцию для удаления папки со всеми файлами и подпапками:

 function removedir($dir) { if (substr($dir, strlen($dir) - 1, 1) != '/') $dir .= '/'; if ($handle = opendir($dir)) { while ($obj = readdir($handle)) { if ($obj != '.' && $obj != '..') { if (is_dir($dir . $obj)) { if (!removedir($dir . $obj)) return false; } else if (is_file($dir . $obj)) { if (!unlink($dir . $obj)) return false; } } } closedir($handle); if (!@rmdir($dir)) return false; return true; } return false; } $folder_to_delete = "folder"; // folder to be deleted echo removedir($folder_to_delete) ? 'done' : 'not done'; 

Iirc я получил это от php.net

  1. Вы можете предоставить дополнительный параметр массива $exclusions для recursive_remove_directory() , но вам придется передавать этот параметр каждый раз рекурсивно.

  2. Сделать $exclusions глобальными. Таким образом, он может быть доступен на каждом уровне рекурсии.