2010-07-03 46 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