рекурсивная функция удаления каталога для php?

<p>я использую php для перемещения содержимого подпапки изображений</p><blockquote> <p>galleryname/изображения /</p> </blockquote><p>в другую папку. после переезда мне нужно удалить каталог galleryname <em>и все остальное внутри него</em>. </p><p>я знаю, что <code>rmdir()</code> не будет работать, если каталог не пуст. я потратил некоторое время, пытаясь построить рекурсивную функцию для <code>scandir()</code>, начиная с вершины, а затем <code>unlink()</code>, если это файл, и <code>scandir()</code>, если это каталог, а затем <code>rmdir()</code>, каждый пустой каталог. </p><p>пока что это работает не совсем правильно, и я начал думать -<strong> разве это не смехотворно простая функция, которую php должен уметь делать? </strong>удалить каталог?</p><p>так я что-то упустил? или есть хотя бы проверенная функция, которую люди используют для этого действия? </p><p>любая помощь будет оценена.</p><p><strong> ps я доверяю всем вам здесь больше, чем комментариям на сайте php.net - там есть сотни функций, но мне интересно узнать, если кто-то из вас рекомендует одну из них. </strong></p>

<p>как насчет этого вопроса?</p><pre><code>foreach(new recursiveiteratoriterator(new recursivedirectoryiterator($dirpath, filesystemiterator::skip_dots), recursiveiteratoriterator::child_first) as $path) { $path->isdir() && !$path->islink() ? rmdir($path->getpathname()) : unlink($path->getpathname()); } rmdir($dirpath); 

это рекурсивная функция, которую я создал/изменил, и, похоже, наконец-то она работает. надеюсь, в этом нет ничего слишком опасного.function destroy_dir($dir) { if (!is\_dir($dir) || is_link($dir)) return unlink($dir); foreach (scandir($dir) as $file) { if ($file == '.' || $file == '..') continue; if (!destroy_dir($dir . directory\_separator . $file)) { chmod($dir . directory\_separator . $file, 0777); if (!destroy_dir($dir . directory\_separator . $file)) return false; }; } return rmdir($dir); } </code></pre>

<p>если сервер приложения работает под управлением linux, просто используйте функцию shell\_exec () и предоставьте ей команду rm -r, например:</p><pre><code>shell\_exec("rm ".$dir_path." -r"); объяснение:функция будет запускать вставленную команду прямо в linux. это точно то же самое, что запустить команду в терминале linux.команда rm удаляет файл или каталог, переданный в $dir\_path</code>, а опция <code>-r</code> указывает системе рекурсивно запускать ее.</p>

<p>я адаптировал функцию, которая обрабатывает скрытые файлы unix с префиксом точки и использует glob:</p><pre><code>public static function deletedir($path) { if (!is_dir($path)) { throw new invalidargumentexception("$path is not a directory"); } if (substr($path, strlen($path) - 1, 1) != '/') { $path .= '/'; } $dotfiles = glob($path . '.*', glob\_mark); $files = glob($path . '*', glob\_mark); $files = array_merge($files, $dotfiles); foreach ($files as $file) { if (basename($file) == '.' || basename($file) == '..') { continue; } else if (is_dir($file)) { self::deletedir($file); } else { unlink($file); } } rmdir($path); } 

public static function rrmdir($dir) { if (is\_dir($dir)) { $files = scandir($dir); foreach ($files as $file) { if ($file != "." && $file != "..") { if (filetype($dir . "/" . $file) == "dir") self::rrmdir($dir . "/" . $file); else unlink($dir . "/" . $file); } } reset($files); rmdir($dir); } } 

здесь есть еще один поток с большим количеством примеров: <a href="https://stackoverflow.com/questions/3338123/how-do-i-recursively-delete-a-directory-and-its-entire-contents-filessub-dirs">как мне рекурсивно удалить каталог и все его содержимое (файлы + вложенные каталоги) в php? если вы используете yii, вы можете оставить это для фреймворка:cfilehelper::removedirectory($my\_directory); </code></pre>

<p>я предпочитаю расширенный метод, полученный на страницах справки php <a href="http://php.net/manual/en/function.rmdir.php#115598">http://php.net/manual/en/function.rmdir.php#115598</a> </p><pre><code> // check accidential empty, root or relative pathes if (!empty($path) && ...) { if (php_os === 'windows') { exec('rd /s /q "'.$path.'"'); } else { exec('rm -rf "'.$path.'"'); } } else { error_log('path not valid:$path'.var\_export($path, true)); } </code></pre><p>причины моего решения:</p><ul> <li>меньше кода</li> <li>скорость</li> <li>будь проще</li> </ul>