Удалить пустые папки php

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

Я работаю над функцией PHP, которая будет рекурсивно удалять все подпапки, которые не содержат файлов, начиная с заданного абсолютного пути.

Вот код, разработанный на данный момент:

function RemoveEmptySubFolders($starting_from_path) < // Returns true if the folder contains no files function IsEmptyFolder($folder) < return (count(array_diff(glob($folder.DIRECTORY_SEPARATOR."*"), Array(".", ".."))) == 0); >// Cycles thorugh the subfolders of $from_path and // returns true if at least one empty folder has been removed function DoRemoveEmptyFolders($from_path) < if(IsEmptyFolder($from_path)) < rmdir($from_path); return true; >else < $Dirs = glob($from_path.DIRECTORY_SEPARATOR."*", GLOB_ONLYDIR); $ret = false; foreach($Dirs as $path) < $res = DoRemoveEmptyFolders($path); $ret = $ret ? $ret : $res; >return $ret; > > while (DoRemoveEmptyFolders($starting_from_path)) <> > 

Согласно моим тестам, эта функция работает, хотя я был бы очень рад увидеть какие-либо идеи по улучшению производительности кода.

6 ответов

Если у вас есть пустая папка в пустой папке внутри пустой папки, вам нужно будет пройти через ВСЕ папки три раза. Все это потому, что вы идете в ширину в первую очередь — тестируйте папку ДО тестирования ее дочерних элементов. Вместо этого вам следует перейти в дочерние папки перед проверкой, если родительский элемент пуст, так что одного прохода будет достаточно.

function RemoveEmptySubFolders($path) < $empty=true; foreach (glob($path.DIRECTORY_SEPARATOR."*") as $file) < if (is_dir($file)) < if (!RemoveEmptySubFolders($file)) $empty=false; >else < $empty=false; >> if ($empty) rmdir($path); return $empty; > 

Кстати, шар не возвращается. и.. записи.

function RemoveEmptySubFolders($path) < $empty=true; foreach (glob($path.DIRECTORY_SEPARATOR."*") as $file) < $empty &= is_dir($file) && RemoveEmptySubFolders($file); >return $empty && rmdir($path); > 

Источник

PHP: Удаление директории

Данная функция рекурсивно удалит саму директорию и её содержимое:

function removeDirectory(string $dir): void < if (is_dir($dir)): chmod($dir, 0777); if ($elements = glob($dir . "/*")): foreach($elements as $element): is_dir($element) ? removeDirectory($element) : unlink($element); endforeach; endif; rmdir($dir); endif; >$dir = __DIR__ . '/dir'; removeDirectory($dir);
function removeDirectory(string $dir): void < if (is_dir($dir)): $elements = array_diff(scandir($dir), ['.','..']); foreach ($elements as $element): is_dir("$dir/$element") ? removeDirectory("$dir/$element") : unlink("$dir/$element"); endforeach; rmdir($dir); endif; >$dir = __DIR__ . '/dir'; removeDirectory($dir);

Удаление только содержимого директории

Данная функция удалит только содержимое директории (очистить её), если не передать в неё вторым параметром флаг на удаление самой директрии.

function clearDir(string $dir, bool $rmdir = false): void < if (is_dir($dir)): if ($objs = glob($dir . '/*')): foreach($objs as $obj): is_dir($obj) ? clearDir($obj, true) : unlink($obj); endforeach; endif; if ($rmdir) rmdir($dir); endif; >$dir = __DIR__ . '/dir'; clearDir($dir); // Очистить директорию и удалить саму директорию clearDir($dir, true);

Удалить файлы из директории, кроме некоторых

Например, нужно удалить все файлы, кроме файла .htaccess . Здесь важно то, что функция работает НЕ рекурсивно и удаляет только файлы:

function removeFilesExcept(string $dir, array $except): void < if (is_dir($dir)): foreach (glob($dir . '/*') as $file): if (!in_array(basename($file), $except) && is_file($file)): unlink($file); endif; endforeach; endif; >$dir = __DIR__ . '/dir'; $except = ['.htaccess']; removeFilesExcept($dir, $except);

Источник

Читайте также:  Таблица

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

Я работаю над функцией PHP, которая рекурсивно удалит все подпапки, которые не содержат файлов, начинающихся с заданного абсолютного пути.

Вот код, разработанный до сих пор:

function RemoveEmptySubFolders($starting_from_path) < // Returns true if the folder contains no files function IsEmptyFolder($folder) < return (count(array_diff(glob($folder.DIRECTORY_SEPARATOR."*"), Array(".", ".."))) == 0); >// Cycles thorugh the subfolders of $from_path and // returns true if at least one empty folder has been removed function DoRemoveEmptyFolders($from_path) < if(IsEmptyFolder($from_path)) < rmdir($from_path); return true; >else < $Dirs = glob($from_path.DIRECTORY_SEPARATOR."*", GLOB_ONLYDIR); $ret = false; foreach($Dirs as $path) < $res = DoRemoveEmptyFolders($path); $ret = $ret ? $ret : $res; >return $ret; > > while (DoRemoveEmptyFolders($starting_from_path)) <> > 

По моим испытаниям эта функция работает, хотя я был бы очень рад увидеть любые идеи для лучшего выполнения кода.

Если у вас есть пустая папка в пустой папке в пустой папке, вам нужно будет циклически перебирать ВСЕ папки три раза. Все это, потому что вы сначала выбираете ширину – тестовую папку перед тестированием своих детей. Вместо этого вы должны перейти в дочерние папки перед тестированием, если родительский пуст, таким образом, одного прохода будет достаточно.

function RemoveEmptySubFolders($path) < $empty=true; foreach (glob($path.DIRECTORY_SEPARATOR."*") as $file) < if (is_dir($file)) < if (!RemoveEmptySubFolders($file)) $empty=false; >else < $empty=false; >> if ($empty) rmdir($path); return $empty; > 

Кстати, glob не возвращается. и .. записи.

function RemoveEmptySubFolders($path) < $empty=true; foreach (glob($path.DIRECTORY_SEPARATOR."*") as $file) < $empty &= is_dir($file) && RemoveEmptySubFolders($file); >return $empty && rmdir($path); > 

Можно сделать немного более читаемым:

Или, если PHP имеет побитовый оператор:

Вы можете выполнить команду unix для удаления пустых каталогов.

exec («find $ start_from_path -type d -empty -exec rmdir <> \; 2> / dev / null»);

Читайте также:  Php default page index php

Это может вызвать проблемы, потому что несколько раз вызовет RemoveEmptySubFolders , возможно, произнесет ошибки, потому что каждый раз, когда вы вызываете эту функцию, остальные 2 функции определяются снова. Если они уже определены, PHP будет вызывать ошибку, заявив, что функция с тем же именем уже определена.

Вместо этого попробуйте рекурсивно:

function removeEmptySubfolders($path) < if(substr($path,-1)!= DIRECTORY_SEPARATOR)< $path .= DIRECTORY_SEPARATOR; >$d2 = array('.','..'); $dirs = array_diff(glob($path.'*', GLOB_ONLYDIR),$d2); foreach($dirs as $d) < removeEmptySubfolders($d); >if(count(array_diff(glob($path.'*'),$d2))===0) < rmdir($path); >> 

Протестировано, работает красиво. Windows 7 PHP 5.3.0 XAMPP

Вы можете попробовать это.

function removeEmptySubfolders($path) < if(substr($path,-1)!= DIRECTORY_SEPARATOR)< $path .= DIRECTORY_SEPARATOR; >$d2 = array('.','..'); $dirs = array_diff(glob($path.'*', GLOB_ONLYDIR),$d2); foreach($dirs as $d) < removeEmptySubfolders($d); >if(count(array_diff(glob($path.'*'),$d2))===0)< $checkEmpSubDir = explode(DIRECTORY_SEPARATOR,$path); for($i=count($checkEmpSubDir)-1;$i>0;$i--) < $path = substr(str_replace($checkEmpSubDir[$i],"",$path),0,-1); if(($files = @scandir($path)) && count($files) > > > 

Решение для Linux, используя инструмент командной строки, но быстрее и проще, чем с чистым PHP

/** * Remove all empty subdirectories * @param string $dirPath path to base directory * @param bool $deleteBaseDir - Delete also basedir if it is empty */ public static function removeEmptyDirs($dirPath, $deleteBaseDir = false) < if (stristr($dirPath, "'")) < trigger_error('Disallowed character `Single quote` (\') in provided `$dirPath` parameter', E_USER_ERROR); >if (substr($dirPath, -1) != '/') < $dirPath .= '/'; >$modif = $deleteBaseDir ? '' : '*'; exec("find '".$dirPath."'".$modif." -empty -type d -delete", $out); > 

Если вам нужна поддержка Windows, используйте константу PHP_OS и этот однострочный

for /f "delims=" %d in ('dir /s /b /ad ^| sort /r') do rd "%d"`enter code here 

Источник

Рекурсивное удаление файлов и директорий на PHP

Рассказываю, как с помощью PHP удалять директории с файлами.

Удалить файл, группу файлов или пустые директории на PHP достаточно просто — для этого есть UnLink и RmDir. Но как быть если нужно удалить не пустые директории с массой файлов и вложенных поддиректорий? Для этого существует рекурсивное удаление.

$dirPath = 'samples/'; public static function deleteDir($dirPath) < if (! is_dir($dirPath)) < throw new InvalidArgumentException("$dirPath must be a directory"); >if (substr($dirPath, strlen($dirPath) - 1, 1) != '/') < $dirPath .= '/'; >$files = glob($dirPath . '*', GLOB_MARK); foreach ($files as $file) < if (is_dir($file)) < self::deleteDir($file); >else < unlink($file); >> rmdir($dirPath); >

В PHP 5.2 и выше данную процедуру можно проделать с помощью RecursiveIterator.

$dir = 'samples' . DIRECTORY_SEPARATOR . 'sampledirtree'; $it = new RecursiveDirectoryIterator($dir); $files = new RecursiveIteratorIterator($it, RecursiveIteratorIterator::CHILD_FIRST); foreach($files as $file) < if ($file->getFilename() === '.' || $file->getFilename() === '..') < continue; >if ($file->isDir())< rmdir($file->getRealPath()); > else < unlink($file->getRealPath()); > > rmdir($dir);

⚡️ Подписывайся на мой канал @DanilinBiz и ты узнаешь, почему фриланс это свобода, а работа в штате рабство.

Делаю сайты на Вордпресс с 2008 года, в том числе уникальные инструменты для решения сложных бизнес‑задач.

Источник

Оцените статью