PHP - самый быстрый способ найти, если каталог имеет детей? - PullRequest
3 голосов
/ 22 июля 2011

Я создаю файловый браузер, и мне нужно знать, есть ли у каталога дочерние элементы (но не сколько и какого типа).

Какой самый эффективный способ найти, если у каталога есть дочерние элементы?glob()?scandir() это?Проверьте свои налоговые записи?

Редактировать

Кажется, меня неправильно поняли, хотя я думал, что довольно ясно.Я попытаюсь повторить свой вопрос.

Каков самый эффективный способ узнать, не является ли каталог пустым?Я в основном ищу логический ответ - НЕ ПУСТО или ПУСТО.

Я не нужно знать:

  • сколько файлов в каталоге
  • какие файлы
  • когда они были изменены
  • и т. Д.

I do необходимо знать:

  • есть ли в каталоге какие-либо файлыв нем вообще

эффективно.

Ответы [ 5 ]

12 голосов
/ 22 июля 2011

Я думаю, что это очень эффективно:

function dir_contains_children($dir) {
    $result = false;
    if($dh = opendir($dir)) {
        while(!$result && ($file = readdir($dh)) !== false) {
            $result = $file !== "." && $file !== "..";
        }

        closedir($dh);
    }

    return $result;
}

Останавливает вывод содержимого каталогов, как только найден файл или каталог (не включая . и ..).

2 голосов
/ 22 июля 2011

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

Итак, я был вынужден самостоятельно создать решение, которое я буду реализовывать, пока не появится что-то лучшее:

if(count(glob($dir."/*")) { 
  echo "NOT EMPTY"; 
}

Все еще не уверен в эффективности этого по сравнению с другими методами, который был оригинальным вопросом.

2 голосов
/ 22 июля 2011

Это должно быть легко, быстро и эффективно.

<?php
function dir_is_empty($dir) {
  $dirItems = count(scandir($dir));
  if($dirItems > 2) return false;
  else return true;
}
?>
2 голосов
/ 22 июля 2011

Вы можете использовать 'find', чтобы вывести все пустые каталоги за один шаг:

exec("find '$dir' -maxdepth 1 -empty -type d",$out,$ret);
print_r($out);

Это не "чистый" php, а простой и быстрый.

1 голос
/ 30 апреля 2014

Я хотел бы расширить ответ vstm - Проверять только дочерние каталоги (а не файлы):

/**
* Check if directory contains child directories.
*/
function dir_contains_children_dirs($dir) {
  $result = false;
    if($dh = opendir($dir)) {
       while (!$result && ($file = readdir($dh))) {
         $result = $file !== "." && $file !== ".." && is_dir($dir.'/'.$file);
       }
       closedir($dh);
    }

  return $result;
}
...