代码之家  ›  专栏  ›  技术社区  ›  erjiang

PHP等效于'du'命令?

  •  2
  • erjiang  · 技术社区  · 14 年前

    我正在用PHP编写一个简单的文件缓存引擎,它需要能够看到一个目录有多大。我要找的是Unix的等价物 du 命令打印目录的总文件大小。我可以自己写,但如果其他人已经解决了递归和处理符号链接等所有问题,那就太好了。

    1 回复  |  直到 14 年前
        1
  •  5
  •   Gordon Haim Evgi    14 年前

    大致是这样的:

    $iterator = new RecursiveIteratorIterator(
                    new RecursiveDirectoryIterator(
                        '/path/to/a/folder'));
    

    迭代器将允许您递归地迭代指定的文件夹和子文件夹并返回 SplFileInfo 物体。默认选项是只返回叶子,例如文件,而不返回目录项,因此可以执行以下操作:

    $size = 0;
    foreach($iterator as $file) {
        $size += filesize($file->getRealPath());
    }
    echo $size;
    

    通过使用 getRealPath() 在文件中,我们确保所有符号链接都已展开。但不确定这是否会考虑到指向目录的符号链接。我只是不知道他们是否被认为是树叶。

    总之,这里有一个使用lambda的函数方法:

    echo array_reduce(iterator_to_array($iterator), function($size, $file) {
        $size += filesize($file->getRealPath());
        return $size;
    });
    

    另一种方法是使用自定义迭代器:

    class FileSizeIterator extends RecursiveIteratorIterator
    {
        public function current() {
            return filesize($this->getInnerIterator()->current()->getRealpath());
        }
    }
    
    echo array_sum(iterator_to_array(new FileSizeIterator(
            new RecursiveDirectoryIterator('/path/to/a/folder'))));
    

    您可能需要将结果与 du