2010-07-03 76 views
2

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

+0

'system('du');':p – kennytm 2010-07-03 20:28:46

+0

@Kenny这是最简单但最不便携的解决方案 – Gordon 2010-07-03 20:37:31

回答

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,以确保它的正确。

+0

这是如何处理符号链接的? – erjiang 2010-07-03 19:48:53

+0

@mazin我不知道PHP如何对待符号链接到目录,以及它是否会遍历它们。对于符号链接到文件,你得到的RealPath应该足够了。只要尝试以上任何一项,看看它是否与'du'的结果相匹配 – Gordon 2010-07-03 20:44:25