Я написал рекурсивную функцию 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
Вы можете предоставить дополнительный параметр массива $exclusions
для recursive_remove_directory()
, но вам придется передавать этот параметр каждый раз рекурсивно.
Сделать $exclusions
глобальными. Таким образом, он может быть доступен на каждом уровне рекурсии.