开发者

How to change a recursive function for count files and catalogues?

<?php
function scan_dir($dirname)   {
$file_count = 0 ;     
$dir_count = 0 ;      
$dir = opendir($dirname);
while (($file = readdir($dir)) !== false) {
if($file != "." && $file != "..")  {
if(is_file($dirname."/".$file))
++$file_count;
if(is_dir($dirname."/".$file)) {
++ $dir_count;
scan_dir($dirname."/".$file);
}
}
}
closedir($dir);
echo "There are $dir_count catalogues and $file_count files.<br>";
}

$dirname = "/home/user/path";
scan_dir($dirname);
?>  

Hello,

I have a recursive function for count files and catalogues. It returns result for ea开发者_StackOverflow中文版ch catalogue.

But I need a common result. How to change the script?

It returns :

There are 0 catalogues and 3 files.

There are 0 catalogues and 1 files.

There are 2 catalogues and 14 files.

I want:

There are 2 catalogues and 18 files.


You could tidy up the code a lot with RecursiveDirectoryIterator.

$dirs = new RecursiveIteratorIterator(
          new RecursiveDirectoryIterator(dirname(__FILE__))
        , TRUE);

$dirsCount = $filesCount = 0;

while ($dirs->valid()) {

    if ($dirs->isDot()) {
       $dirs->next();
    } else if ($dirs->isDir()) {
        $dirsCount++;
    } else if ($dirs->isFile()) {
        $filesCount++;
    }
    $dirs->next();
}

var_dump($dirsCount, $filesCount);


You can return values from each recursive call, and sum those and return back to its caller.

<?php
function scan_dir($dirname)   {
$file_count = 0 ;     
$dir_count = 0 ;      
$dir = opendir($dirname);
$sub_count = 0;
while (($file = readdir($dir)) !== false) {
if($file != "." && $file != "..")  {
if(is_file($dirname."/".$file))
++$file_count;
if(is_dir($dirname."/".$file)) {
++ $dir_count;
$sub_count += scan_dir($dirname."/".$file);
}
}
}
closedir($dir);
echo "There are $dir_count catalogues and $file_count files.<br>";
return $sub_count + $dir_count + $file_count;
}

$dirname = "/home/user/path";
echo "Total count is ". scan_dir($dirname);
?>

The code will give you the net count of every item.


With a simple modification. Just, for example, keep the counts in an array that you can return from the function to add up to the previous counts, like so:

<?php
function scan_dir($dirname)   {
    $count['file'] = 0;
    $count['dir'] = 0;
    $dir = opendir($dirname);
    while (($file = readdir($dir)) !== false) {
        if($file != "." && $file != "..")  {
            if(is_file($dirname."/".$file))
                $count['file']++;
            if(is_dir($dirname."/".$file)) {
                $count['dir']++;
                $counts = scan_dir($dirname."/".$file);
                $count['dir'] += $counts['dir'];
                $count['file'] += $counts['file'];
            }
        }
    }
    closedir($dir);

    return $count;
}

$dirname = "/home/user/path";
$count = scan_dir($dirname);
echo "There are $count[dir] catalogues and $count[file] files.<br>";
?>  


In my opnion, you should separate counting file & counting dir to 2 different function. It will clear things up:

<?php
function scan_dir_for_file($dirname)   {

  $file_count = 0 ;     

  $dir = opendir($dirname);

  while (($file = readdir($dir)) !== false) {
    if($file != "." && $file != "..")  {
      if(is_file($dirname."/".$file))
      {
         ++$file_count;
      } else {
         $file_count = $file_count + scan_dir($dirname."/".$file);
      }
   }
  }

  return $file_count
}
?>  

The directory_count function is similar.

0

上一篇:

下一篇:

精彩评论

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

最新问答

问答排行榜