2010-05-07 2 views

Antwort

16

Mit DirectoryIterator und SplFileInfo

$totalSize = 0; 
foreach (new DirectoryIterator('/path/to/dir') as $file) { 
    if ($file->isFile()) { 
     $totalSize += $file->getSize(); 
    } 
} 
echo $totalSize; 

und den Fall, dass Sie, dass einschließlich der Unterordner:

$iterator = new RecursiveIteratorIterator(
    new RecursiveDirectoryIterator('/path/to/dir') 
); 

$totalSize = 0; 
foreach ($iterator as $file) { 
    $totalSize += $file->getSize(); 
} 
echo $totalSize; 

A Und Sie können $totalSize über den Code laufen lassen, den wir Ihnen format 6000 to 6k für eine menschlichere lesbare Ausgabe gegeben haben. Du müsstest alle 1000er auf 1024 ändern.

+0

awasome antwort :) mit dies ist so einfach. Danke für die Antwort – Blueblazer172

9
echo array_sum(array_map('filesize', glob('*'))); 
+0

Ich mag diese Version –

+0

, die Verzeichnisse nicht ausschließt, oder? Es ist auch ineffizient. Zuerst globe du die Dateinamen, dann ersetzst du sie mit ihrer Größe und summierst sie dann. Das sind zwei zusätzliche Iterationen über das ursprüngliche Array, wenn Sie alles in einer Iteration durchführen können. – Gordon

+0

Sie könnten auch 'GLOB_NOSORT' hinzufügen, wenn Sie die Dateireihenfolge sowieso nicht interessiert. Siehe http://www.phparch.com/2010/04/28/putting-glob-to-the-test/ - das sollte dem Glob etwas mehr Geschwindigkeit verleihen. Immer noch nicht optimal. – Gordon

3

Nun versuchen Sie dies filesize() zu verwenden, um die Dateigröße beim Durchlaufen aller Dateien und Unterverzeichnisdateien zu berechnen.

<?php 
function get_dir_size($dir_name){ 
    $dir_size =0; 
    if (is_dir($dir_name)) { 
     if ($dh = opendir($dir_name)) { 
      while (($file = readdir($dh)) !== false) { 
       if($file !=”.” && $file != “..”){ 
        if(is_file($dir_name.”/”.$file)){ 
         $dir_size += filesize($dir_name.”/”.$file); 
        } 
       /* check for any new directory inside this directory */ 
       if(is_dir($dir_name.”/”.$file)){ 
        $dir_size += get_dir_size($dir_name.”/”.$file); 
        } 
       } 
      } 
     } 
    } 
closedir($dh); 
return $dir_size; 
} 

$dir_name = “directory name here”; 
/* 1048576 bytes == 1MB */ 
$total_size= round((get_dir_size($dir_name)/1048576),2) ; 
print “Directory $dir_name size : $total_size MB”; 
?> 
0

wenn Sie Zugriff auf exec Funktion haben, können Sie diesen Code verwenden:

exec("du {directory_path_you_want_see_size} -s 2>&1",$output); 
echo intval($output[0]) ; 

Beispiel:

exec("du /home/ -s 2>&1",$output); 
echo intval($output[0]) ; 
+0

Bitte empfehlen Sie nicht die Verwendung von 'exec()', vor allem, wenn es irgendeine Art von variablen, vom Benutzer bereitgestellten Eingaben beinhaltet. Das eröffnet nur die Möglichkeit für Shell-Befehls-Injektionen und all ihre sicherheitsrelevanten Implikationen, und niemand will das wirklich. Wenn es jedoch nicht vermieden werden kann, zeigen Sie zumindest auf [escapeshellarg()] (http://php.net/manual/en/function.escapeshellarg.php) oder eine andere Möglichkeit, Benutzereingaben zu bereinigen, bevor sie an 'übergeben werden exec() '. – Striezel

Verwandte Themen