Как удалить папку с содержимым с помощью PHP

Мне нужно удалить папку с содержимым с помощью PHP. rmdir() и unlink() удалять пустые папки, но не могут удалять папки с содержимым.

Эта функция позволит вам удалить любую папку (пока она доступна для записи), а также файлы и подкаталоги.

 function Delete($path) { if (is_dir($path) === true) { $files = array_diff(scandir($path), array('.', '..')); foreach ($files as $file) { Delete(realpath($path) . '/' . $file); } return rmdir($path); } else if (is_file($path) === true) { return unlink($path); } return false; } 

Или без рекурсии с помощью RecursiveDirectoryIterator :

 function Delete($path) { if (is_dir($path) === true) { $files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::CHILD_FIRST); foreach ($files as $file) { if (in_array($file->getBasename(), array('.', '..')) !== true) { if ($file->isDir() === true) { rmdir($file->getPathName()); } else if (($file->isFile() === true) || ($file->isLink() === true)) { unlink($file->getPathname()); } } } return rmdir($path); } else if ((is_file($path) === true) || (is_link($path) === true)) { return unlink($path); } return false; } 

Вам необходимо обходить содержимое папки (включая содержимое любых подпапок) и сначала удалить их.

Вот пример: http://lixlpixel.org/recursive_function/php/recursive_directory_delete/

Будьте осторожны с этим !!!

Вот сценарий, который будет делать то, что вам нужно:

 /** * Recursively delete a directory * * @param string $dir Directory name * @param boolean $deleteRootToo Delete specified top-level directory as well */ function unlinkRecursive($dir, $deleteRootToo) { if(!$dh = @opendir($dir)) { return; } while (false !== ($obj = readdir($dh))) { if($obj == '.' || $obj == '..') { continue; } if (!@unlink($dir . '/' . $obj)) { unlinkRecursive($dir.'/'.$obj, true); } } closedir($dh); if ($deleteRootToo) { @rmdir($dir); } return; } 

Я получил его с php.net, и он работает.

Вам придется удалить все файлы рекурсивно. В комментариях справочной страницы rmdir есть много примеров:

http://www.php.net/rmdir

В PHP нет единой встроенной функции, которая позволила бы это сделать, вам нужно написать свой собственный с помощью rmdir и отменить связь.

Пример (взятый из комментария к документам php.net ):

 <? // ensure $dir ends with a slash function delTree($dir) { $files = glob( $dir . '*', GLOB_MARK ); foreach( $files as $file ){ if( substr( $file, -1 ) == '/' ) delTree( $file ); else unlink( $file ); } rmdir( $dir ); } ?> 

Вы всегда можете обманывать и выполнять shell_exec("rm -rf /path/to/folder");

Возможно, лучший подход – использовать rm (если вы находитесь под Linux). Это будет похоже на это ( $root должен ВСЕГДА быть установлен в ваш TMP directory чтобы предотвратить удаление жизненно важных файлов!):

 function remove($dir) { $root = $_SERVER['DOCUMENT_ROOT'].'/tmp/'; if (is_dir($root.$dir)) { exec('rm -rf '.$root.$dir); } }