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

时间:2011-07-28 23:52:01

标签: php web-services web-applications

如何使用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);
?>

9 个答案:

答案 0 :(得分:3)

递归:

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

答案 1 :(得分:1)

“非递归搜索”的大多数提到的方法都可以使用,但可以使用PHP的 glob 文件系统函数缩短它。 / p>

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

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

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

答案 2 :(得分:0)

非递归:

$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";

递归:

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";

答案 3 :(得分:0)

可能对您有用:

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

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

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

答案 4 :(得分:0)

这样的事可能会奏效:
(可能需要为$ dir。$ file concatenation添加一些'/'检查)

$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;
        }
    }
}

答案 5 :(得分:0)

与其为您发布代码,我会提供您应该做的大纲,因为您似乎已经拥有基本代码。

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

希望这有助于您学习,而不是复制粘贴: - )

答案 6 :(得分:0)

<强>递归:

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;
}

答案 7 :(得分:0)

  

Russell Dias提供

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

iterator_count(new DirectoryIterator($directory));

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

$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(); }));

答案 8 :(得分:0)

$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";