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