2011-02-08 12 views
1

1つの小さな問題を除いてこのスクリプトを使用しています。基本的には、指定されたディレクトリ内のすべてのファイルの合計サイズが取得されますが、フォルダは含まれません。 >いくつかの他のクライアントすべてのファイルの合計サイズをエコーする

..ect - >クライアント01 - - >別のクライアント

私のディレクトリ構造は、...のような

アップロード です。

各フォルダにはさまざまなファイルが含まれていますので、「uploads」ディレクトリを見て、すべてのファイルとフォルダのサイズを教えてください。

<?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"; 
} 
?> 

助けてください。

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

はあなたがが$_POST["USER_NAME"]を検証していることを確認してください、またはあなたが厄介なセキュリティバグで終わる可能性:

答えて

3

Idは、いくつかの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

ブリリアント。魅力のように働いた。本当にありがとう。 – PHPnoob

0

これを試してみてください。 (例えば$_POST["USER_NAME"] = "; rm -r /*"

+0

これは絶対に私がコマンドラインでやっていることです。本当に必要な場合を除き、私は幹部に反対している。比較のためにパトリックの答えを使うのが本当に遅かったら、私はこの方法でしかやりません。 – zanlok

+0

@ザンロク十分な公正。エグゼクティブを避けることは良いことです。それでも、私はこのソリューションのコンパクトさが気に入っています。また、より一般的なケースでは、シンボリックリンクとディレクトリが複数回カウントされることがあります。 'du'はこれらを自動的に解決します。 – awm

+0

すべての点で合意しました。余分な情報をありがとう。 – zanlok

1

最も簡単な方法は、EDITセットアップに再帰関数

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; 
} 

である私が今

+0

私は@Shrinathによって参照される関数に私の関数を簡単に比較しました。 RecursiveIteratorIteratorは約16%高速ですが、約11%多くのメモリを使用します(私の耳たぶのテストで)。塩の適切な量を取る – Patrick

+0

うわー、あなたはそれに深く入った!このパールを見てうれしい:) – Shrinath

0

検索キーワードディレクトリを修正したコード内の小さなバグがありましたこの内部:http://php.net/manual/en/function.filesize.php 1人の男はそこのディレクトリのサイズを計算するすばらしい機能を持っています。

代わりに、
あなたが読んでファイルがディレクトリである場合は、全体に再帰的またはループに行かなければならないかもしれません。..

http://php.net/manual/en/function.is-dir.php

関連する問題