Удалите пустые подпапки с PHP

_MSC_VER должен быть определен к определенному номеру версии. Вы можете или #ifdef на нем, или можно использовать фактическое, определяют и делают тест во время выполнения. (Если по некоторым причинам Вы хотели выполнить различный код на основе того, с каким компилятором он был скомпилирован? Да, вероятно, Вы искали #ifdef.:))

6
задан Dmitry Letano 2 December 2009 в 15:12
поделиться

4 ответа

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

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);
}
23
ответ дан 8 December 2019 в 04:30
поделиться

Эта строка

$ret = $ret ? $ret : $res;

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

$ret = $ret || $res;

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

$ret |= $res;
1
ответ дан 8 December 2019 в 04:30
поделиться

Это может означать проблемы, потому что вызов RemoveEmptySubFolders несколько раз, вероятно, приведет к ошибке, потому что каждый раз, когда вы вызываете функцию, другие две функции определены снова. Если они уже были определены, 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

0
ответ дан 8 December 2019 в 04:30
поделиться

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

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) <= 2){
        rmdir($path);
      }
    }
  }
}
0
ответ дан 8 December 2019 в 04:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: