PHP相当于`du`命令?

时间:2010-07-03 19:37:59

标签: php unix

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

1 个答案:

答案 0 :(得分:5)

有些事情如下:

$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进行比较,以确保其正确无误。