繁体   English   中英

如何使用PHP计算目录中的文件数?

[英]How to count number of files in a directory using PHP?

如何使用PHP计算目录中的文件数?

请回答以下问题:

1.递归搜索 :该目录(正在搜索)可能具有其他几个目录和文件。

2.非递归搜索 :所有目录都应忽略,这些目录都位于要搜索的目录内。 仅考虑文件。

我有以下代码,但正在寻找更好的解决方案。

<?php

     $files = array();
     $dir = opendir('./items/2/l');
     while(($file = readdir($dir)) !== false)
     {
          if($file !== '.' && $file !== '..' && !is_dir($file))
          {
               $files[] = $file;
          }
     }
     closedir($dir);
     //sort($files);
     $nooffiles = count($files);
?>

递归:

$it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir));
$count = 0;
while($it->next()) $count++;

尽管可以使用PHP的glob文件系统功能来缩短“非递归搜索”的工作方式,但大多数提到的方法都可以使用。

它基本上找到与模式匹配的路径名,因此可以用作:

$count = 0;
foreach (glob('path\to\dir\*.*') as $file) {
    $count++;
}

点号前的星号表示文件名,而后号表示文件扩展名。 因此,它的用途可以进一步扩展到对具有特定文件名,特定扩展名或两者的文件计数。

$dir = opendir('dir/');
$i = 0;
while (false !== ($file = readdir($dir))){
    if (!in_array($file, array('.', '..' ))and (!is_dir($file)))
    $i++;
}

echo "There were $i files";

非recrusive:

$dir = opendir('dir/');
$i = 0;
while (false !== ($file = readdir($dir))){
    if (!in_array($file, array('.', '..') and !is_dir($file)) $i++;
}

echo "There were $i files";

recrusive:

function crawl($dir){

    $dir = opendir($dir);
    $i = 0;
    while (false !== ($file = readdir($dir)){
            if (is_dir($file) and !in_array($file, array('.', '..'))){

            $i += crawl($file);
        }else{
            $i++;
        }

    }
    return $i;
}
$i = crawl('dir/');
echo "There were $i files";

可能对您有用:

http://www.php.net/manual/en/class.dir.php

http://www.php.net/manual/en/function.is-file.php

但是,我认为,没有其他好的解决方案。

这样的事情可能会起作用:
(可能需要为$ dir。$ file串联添加一些对“ /”的检查)

$files = array();
$dir = './items/2/l';

countFiles($dir, $files); // Recursive
countFiles($dir, $files, false); // Not recursive;

var_dump(count($files));

function countFiles($directory, &$fileArray, $recursive = true){
    $currDir = opendir($directory);    
    while(($file = readdir($dir)) !== false)
    {
        if(is_dir($file) && $recursive){
            countFiles($directory.$fileArray, $saveArray);
        }
        else if($file !== '.' && $file !== '..' && !is_dir($file))
        {
            $fileArray[] = $file;
        }
    }
}

除了要为您发布代码外,我还将概述您似乎已经具备基本代码的情况下应该执行的操作。

将代码放在函数中。 有两个参数($path, $recursive = FALSE) ,在代码中,将is_dir()分开,如果为true并且递归标志为true,则将新路径(当前文件的路径)传递回函数(自参考)。

希望这可以帮助您学习,而不是复制粘贴:-)

递归:

function count_files($path) {

// (Ensure that the path contains an ending slash)

$file_count = 0;

$dir_handle = opendir($path);

if (!$dir_handle) return -1;

while ($file = readdir($dir_handle)) {

    if ($file == '.' || $file == '..') continue;

    if (is_dir($path . $file)){      
        $file_count += count_files($path . $file . DIRECTORY_SEPARATOR);
    }
    else {
        $file_count++; // increase file count
    }
}

closedir($dir_handle);

return $file_count;

}

非递归

$directory = ".. path/";
if (glob($directory . "*.") != false)
{
 $filecount = count(glob($directory . "*."));
 echo $filecount;
}
else
{

 echo 0;
}

Russell Dias提供

您可以使用SPL DirectoryIterator以非递归方式(或使用递归迭代器以递归方式)执行此操作:

iterator_count(new DirectoryIterator($directory));

值得一提的是,这不仅会计算常规文件,还会计算目录,点文件和符号链接。 对于常规文件,您可以使用:

$directory = new DirectoryIterator($directory);
$count = 0;
foreach($directory as $file ){ $count += ($file->isFile()) ? 1 : 0;}

PHP 5.4.0还提供:

iterator_count(new CallbackFilterIterator($directory, function($current) { return $current->isFile(); }));

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM