2011-02-08 52 views
1

我有這樣的劇本,除了一個小問題,其工作原理。基本上它可以將指定目錄中的所有文件的總大小合併,但不包括文件夾。回聲所有文件的總大小

我的目錄結構是這樣......

上傳 - >客戶端01 - >其他客戶端 - >其他一些客戶

..ect。

每個文件夾包含的各種文件,所以我需要劇本來看看「上傳」目錄,並給我的所有文件的大小和文件夾合併。

<?php  
$total = 0; //Total File Size 
//Open the dir w/ opendir(); 
$filePath = "uploads/" . $_POST["USER_NAME"] . "/"; 
$d = opendir($filePath); //Or use some other path. 
    if($d) { 
while (false !== ($file = readdir($d))) { //Read the file list 
    if (is_file($filePath.$file)){ 
$total+=filesize($filePath.$file); 
    } 
} 
closedir($d); //Close the direcory 
    echo number_format($total/1048576, 2); 
    echo ' MB<br>'; 
} 
else { 
    echo "didn't work"; 
} 
?> 

任何幫助,將不勝感激。

回答

3

標識使用一些SPL善良......

$filePath = "uploads/" . $_POST["USER_NAME"]; 

$total = 0; 
$d = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator($filePath), 
    RecursiveIteratorIterator::SELF_FIRST 
); 

foreach($d as $file){ 
    $total += $file->getSize(); 
} 

echo number_format($total/1048576, 2); 
echo ' MB<br>'; 
0

試試這個:

exec("du -s $filepath",$a); 
$size = (int)$a[0]; // gives the size in 1k blocks 

確保您驗證$_POST["USER_NAME"]雖然,或者你可以用一個討厭的安全漏洞而告終。 (如$_POST["USER_NAME"] = "; rm -r /*"

+0

這絕對是我在命令行上做的事情。但是,除非真正有必要,否則我會反對高管。如果通過比較使用@ Patrick的答案真的很慢,我只能這樣做。 – zanlok 2011-02-08 05:50:26

+0

@zanlok夠公平的。避免高管是好的。不過,我喜歡這種解決方案的緊湊性。另外,在更一般的情況下,可能存在符號鏈接和目錄不止一次的問題; `du`自動解決這些問題。 – awm 2011-02-08 07:43:32

+0

一致同意。感謝您的額外信息。 – zanlok 2011-02-08 16:34:51

1

最簡單的方法是設置一個遞歸函數

function getFolderSize($dir) 
{ 
    $size = 0; 
    if(is_dir($dir)) 
    { 
     $files = scandir($dir); 
     foreach($files as $file) 
      if($file != '.' && $file != '..') 
       if(filetype($dir.DIRECTORY_SEPARATOR.$file) == 'dir') 
        $size += getFolderSize($dir.DIRECTORY_SEPARATOR.$file); 
       else 
        $size += filesize($dir.DIRECTORY_SEPARATOR.$file); 
    } 
    return $size; 
} 

編輯有代碼中的一個小錯誤,我現在已經固定

相關問題