PHP相当于`du`命令?

erj*_*ang 2 php unix

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

Gor*_*don 5

有点像这样:

$iterator = new RecursiveIteratorIterator(
                new RecursiveDirectoryIterator(
                    '/path/to/a/folder'));
Run Code Online (Sandbox Code Playgroud)

迭代器将让您递归迭代指定的文件夹和子文件夹并返回SplFileInfo对象.默认选项是仅返回叶子,例如文件,但不返回目录项,因此您可以执行以下操作:

$size = 0;
foreach($iterator as $file) {
    $size += filesize($file->getRealPath());
}
echo $size;
Run Code Online (Sandbox Code Playgroud)

通过getRealPath()在文件上使用,我们确保扩展所有符号链接.不知道这是否会考虑到目录的符号链接.我只是不知道他们是否被认为是叶子.

无论如何,这是一个使用lambda的功能方法:

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

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

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'))));
Run Code Online (Sandbox Code Playgroud)

您可能希望比较结果以du确保它是正确的.