如何在php中递归文件夹中的文件数量

时间:2016-11-23 05:38:56

标签: php recursion directory

我的网络应用程序中有如下文件夹结构。

enter image description here

如何使用php递归获取每个文件夹中的文件数。 我正在使用Codeignaiter。 我对如何完成这项任务一无所知。

  

我无法使用 scandir 功能,因为没有物理功能   path中的目录。只保存在数据库中的文件和文件夹。

这是我的数据库

enter image description here

请提供任何帮助。 谢谢。

3 个答案:

答案 0 :(得分:0)

通过将路径作为参数传递给它来尝试此功能:

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

答案 1 :(得分:0)

如果您希望以递归方式获取项目文件夹中的所有*.php文件,则可以使用以下内容:Source

<?php

$Directory = new RecursiveDirectoryIterator('path/to/project/');
$Iterator = new RecursiveIteratorIterator($Directory);
$Regex = new RegexIterator($Iterator, '/^.+\.php$/i', RecursiveRegexIterator::GET_MATCH);

?>

$Regex将为每个PHP文件包含一个索引数组。

答案 2 :(得分:0)

您可以扩展RecursiveArrayIterator以获得RecursiveDirectoryIterator,但对于您的虚拟文件系统:

class RecursiveVirtualDirectoryIterator extends RecursiveArrayIterator
{
    private $files;

    public function __construct($parentId, $array = [], $flags = 0)
    {
        $this->files = $array;

        parent::__construct(
            $this->getFilesByParentId($parentId),
            $flags
        );
    }

    private $children;
    public function hasChildren()
    {
        $file = $this->current();

        if ($file['is_file']) {
            return false;
        }

        $this->children = $this->getFilesByParentId($file['id']);

        return !empty($this->children);
    }

    private function getFilesByParentId($id)
    {
        return array_filter($this->files, function ($file) use ($id) {
            return $file['parent_id'] === $id;
        });
    }

    public function getChildren()
    {
        $file = $this->current();
        return new static(
            $file['id'],
            $this->children,
            $this->getFlags()
        );
    }
}

然后你可以使用RecursiveIteratorIterator迭代从数据库返回的数组,并计算最顶层文件夹的文件:

$iterator = new RecursiveIteratorIterator(
    new RecursiveVirtualDirectoryIterator(0, $files),
    RecursiveIteratorIterator::SELF_FIRST
);

$currentDirectoryName = null;
$filesCount = [];
foreach ($iterator as $file) {
    if ($iterator->getDepth() === 0 && !$file['is_file']) {
        $currentDirectoryName = $file['name'];
        $filesCount[$currentDirectoryName] = 0;
        continue;
    }

    $filesCount[$currentDirectoryName] += 1; 
}

这是working demo

尽管Standard PHP Library (SPL)的记录很少,但它包含许多有用的东西,可以帮助您不必重复重复使用。