计算目录中的文件,同时使用PHP通过目录和子目录排除其他文件

时间:2015-06-09 12:09:31

标签: php file count directory

我使用SO:https://stackoverflow.com/a/640944/2554788上的函数实现了文件计数代码。

这个功能如下:

function getFileCount($path) {
    $size = 0;
    $ignore = array('.','..','cgi-bin','.DS_Store');
    $files = scandir($path);
    foreach($files as $t) {
        if(in_array($t, $ignore)) continue;
        if (is_dir(rtrim($path, '/') . '/' . $t)) {
            $size += getFileCount(rtrim($path, '/') . '/' . $t);
        } else {
            $size++;
        }   
    }
    return $size;
}

效果很好,直到我想排除某些目录及其所有内容。我需要的是通过:

$ignore = array('.','..','cgi-bin','.DS_Store', 'SPECIAL_DIR');

目前,此功能省略了“SPECIAL_DIR”,但似乎计算了所有内容文件,因为它们在文本上不匹配“SPECIAL_DIR”!

我已经在这里和其他地方碰到了几个解决方案,这些解决方案意味着按路径排除文件,但我没有找到一个专注于递归计数文件的文件(没有列出它们或其他任何事情)。

谢谢大家。

1 个答案:

答案 0 :(得分:0)

我从PHP手册中的用户贡献部分看到了这一点。感谢isharelife dot com dot br的carneiro

function directoryToArray($directory, $recursive = true, $listDirs = false, $listFiles = true, $exclude = '') {
         $arrayItems = array();
         $skipByExclude = false;
         $handle = opendir($directory);
         if ($handle) {
             while (false !== ($file = readdir($handle))) {
             preg_match("/(^(([\.]){1,2})$|(\.(svn|git|md))|(Thumbs\.db|\.DS_STORE))$/iu", $file, $skip);
             if($exclude){
                 preg_match($exclude, $file, $skipByExclude);
             }
             if (!$skip && !$skipByExclude) {
                 if (is_dir($directory. '/' . $file)) {
                     if($recursive) {
                         $arrayItems = array_merge($arrayItems, directoryToArray($directory. '/' . $file, $recursive, $listDirs, $listFiles, $exclude));
                     }
                     if($listDirs){
                         $file = $directory . '/' . $file;
                         $arrayItems[] = $file;
                     }
                 } else {
                     if($listFiles){
                         $file = $directory . '/' . $file;
                         $arrayItems[] = $file;
                     }
                 }
             }
         }
         closedir($handle);
         }
         return $arrayItems;
  }

该函数返回完整的路径列表。排除是通过正则表达式传递给函数,文件计数来自count()返回的数组。

这似乎可以完成这项工作,但是我还在等待关于代码简洁和性能等问题的任何替代答案。