How to calculate the size of a directory

Returns the filesize of a whole folder including all sub folders and files.

/**
 * Calculate the full size of a directory
 *
 * @author      Jonas John
 * @version     0.2
 * @link        https://www.jonasjohn.de/snippets/php/dir-size.htm
 * @param       string   $DirectoryPath    Directory path
 */
function CalcDirectorySize($DirectoryPath) {
 
    // I reccomend using a normalize_path function here
    // to make sure $DirectoryPath contains an ending slash
    // (-> http://www.jonasjohn.de/snippets/php/normalize-path.htm)
 
    // To display a good looking size you can use a readable_filesize
    // function.
    // (-> http://www.jonasjohn.de/snippets/php/readable-filesize.htm)
 
    $Size = 0;
 
    $Dir = opendir($DirectoryPath);
 
    if (!$Dir)
        return -1;
 
    while (($File = readdir($Dir)) !== false) {
 
        // Skip file pointers
        if ($File[0] == '.') continue; 
 
        // Go recursive down, or add the file size
        if (is_dir($DirectoryPath . $File))            
            $Size += CalcDirectorySize($DirectoryPath . $File . DIRECTORY_SEPARATOR);
        else 
            $Size += filesize($DirectoryPath . $File);        
    }
 
    closedir($Dir);
 
    return $Size;
}
Snippet Details



$SizeInBytes = CalcDirectorySize('data/');

Sorry folks, comments have been deactivated for now due to the large amount of spam.

Please try to post your questions or problems on a related programming board, a suitable mailing list, a programming chat-room,
or use a QA website like stackoverflow because I'm usually too busy to answer any mails related
to my code snippets. Therefore please just mail me if you found a serious bug... Thank you!


Older comments:

Shagshag February 13, 2011 at 00:38
private function dirsize($dir) {
$size = 0;
if (is_dir($dir)) {
$objects = scandir($dir);
foreach ($objects as $object)
if ($object != "." && $object != ".." && $object != 'index.php')
if (filetype($dir."/".$object) == "dir")
$size += $this->dirsize($dir."/".$object);
else
$size += filesize($dir."/".$object);
reset($objects);
}
return $size;
}
theA July 18, 2010 at 07:22
What a Crap! Open and close your IF statements if you post a snippet! Untidy Code!
Took me longer to debug than to write myself, man!
Behrooz October 16, 2007 at 19:05
you returned -1 on !$Dir but you didnt handle the -1 result in '$Size += CalcDirectorySize(...'. it would've been better to return 0 and the result wont have those directory sizes included. and I added a $depth to the function witch will cause the program to break on long nested directories. source is available at http://fileserver.void.ir/002/dirsize.tar.gz

Thanks for your great snippets
Behrooz October 16, 2007 at 18:37
using "$File[0] == '.'" will skip .htaccess and other files starting with '.'