开发者

PHP - fastest way to find if directory has children?

I'm building a file browser, and I need to know if a directory has children (but not how many or what type).

What's the most efficient way to find if a directory has children? glob()? scandir() it? Check its tax records?

Edit

It seems I was misunderstood, although I thought I was pretty clear. I'll try to restate my question.

What is the most efficient way to know if a directory is not empty? I'm basically looking for a boolean answer - NOT EMPTY or EMPTY.

I don't need to know:

I do need to know:

  • does the directory have any files in it at all

efficiently.


I think this is very efficient:

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

        closedir($dh);
    }

    return $result;
}

It stops the listing of the directories contents as soon as there is a file or directory found (not including the . and ..).


You could use 'find' to list all empty directories in one step:

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

Its not "pure" php but its simple and fast.


This should do, easy, quick and effective.

<?php
function dir_is_empty($dir) {
  $dirItems = count(scandir($dir));
  if($dirItems > 2) return false;
  else return true;
}
?>


Unfortunately, each solution so far has lacked the brevity and elegance necessary to shine above the rest.

So, I was forced to homebrew a solution myself, which I'll be implementing until something better pops up:

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

Still not sure of the efficiency of this compared to other methods, which was the original question.


I wanted to expand vstm's answer - Check only for child directories (and not files):

/**
* 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;
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜