PHP count total files in directory AND subdirectory function

后端 未结 6 560
小蘑菇
小蘑菇 2021-01-18 22:36

I need to get a total count of JPG files within a specified directory, including ALL it\'s subdirectories. No sub-sub directories.

Structure looks like this :

<
6条回答
  •  爱一瞬间的悲伤
    2021-01-18 23:22

    For the fun of it I've whipped this together:

    class FileFinder
    {
        private $onFound;
    
        private function __construct($path, $onFound, $maxDepth)
        {
            // onFound gets called at every file found
            $this->onFound = $onFound;
            // start iterating immediately
            $this->iterate($path, $maxDepth);
        }
    
        private function iterate($path, $maxDepth)
        {
            $d = opendir($path);
            while ($e = readdir($d)) {
                // skip the special folders
                if ($e == '.' || $e == '..') { continue; }
                $absPath = "$path/$e";
                if (is_dir($absPath)) {
                    // check $maxDepth first before entering next recursion
                    if ($maxDepth != 0) {
                        // reduce maximum depth for next iteration
                        $this->iterate($absPath, $maxDepth - 1);
                    }
                } else {
                    // regular file found, call the found handler
                    call_user_func_array($this->onFound, array($absPath));
                }
            }
            closedir($d);
        }
    
        // helper function to instantiate one finder object
        // return value is not very important though, because all methods are private
        public static function find($path, $onFound, $maxDepth = 0)
        {
            return new self($path, $onFound, $maxDepth);
        }
    }
    
    // start finding files (maximum depth is one folder down) 
    $count = $bytes = 0;
    FileFinder::find('.', function($file) use (&$count, &$bytes) {
        // the closure updates count and bytes so far
        ++$count;
        $bytes += filesize($file);
    }, 1);
    
    echo "Nr files: $count; bytes used: $bytes\n";
    

    You pass the base path, found handler and maximum directory depth (-1 to disable). The found handler is a function you define outside, it gets passed the path name relative from the path given in the find() function.

    Hope it makes sense and helps you :)

提交回复
热议问题