Calculate directory size using PHP

pradeep's Avatar author of Calculate directory size using PHP
This is an article on Calculate directory size using PHP in PHP.
I was wondering whether i could read the size of a directory using PHP. So i thought of making something which could help me read the size of the directory ,no. of directories and the no. of files in the given diretory.
The function "getDirectorySize" will ignore link/shorcuts to files/directory.
The function "sizeFormat" will suffix the size with bytes,KB,MB or GB accordingly.

Here is the code:


PHP Code:
function getDirectorySize($path)
{
  
$totalsize 0;
  
$totalcount 0;
  
$dircount 0;
  if (
$handle opendir ($path))
  {
    while (
false !== ($file readdir($handle)))
    {
      
$nextpath $path '/' $file;
      if (
$file != '.' && $file != '..' && !is_link ($nextpath))
      {
        if (
is_dir ($nextpath))
        {
          
$dircount++;
          
$result getDirectorySize($nextpath);
          
$totalsize += $result['size'];
          
$totalcount += $result['count'];
          
$dircount += $result['dircount'];
        }
        elseif (
is_file ($nextpath))
        {
          
$totalsize += filesize ($nextpath);
          
$totalcount++;
        }
      }
    }
  }
  
closedir ($handle);
  
$total['size'] = $totalsize;
  
$total['count'] = $totalcount;
  
$total['dircount'] = $dircount;
  return 
$total;
}

function 
sizeFormat($size)
{
    if(
$size<1024)
    {
        return 
$size." bytes";
    }
    else if(
$size<(1024*1024))
    {
        
$size=round($size/1024,1);
        return 
$size." KB";
    }
    else if(
$size<(1024*1024*1024))
    {
        
$size=round($size/(1024*1024),1);
        return 
$size." MB";
    }
    else
    {
        
$size=round($size/(1024*1024*1024),1);
        return 
$size." GB";
    }


Example code:

PHP Code:
$path="/httpd/html/pradeep/";
$ar=getDirectorySize($path);

echo 
"<h4>Details for the path : $path</h4>";
echo 
"Total size : ".sizeFormat($ar['size'])."<br>";
echo 
"No. of files : ".$ar['count']."<br>";
echo 
"No. of directories : ".$ar['dircount']."<br>"
Output:
Details for the path : /httpd/html/pradeep/
Total size : 2.9 MB
No. of files : 196
No. of directories : 20

------------------------------------------------------------
This Article is written by S Pradeep for Programming Forum
------------------------------------------------------------

This article is freely available for reprint provided that the resource box at the end of the article is left intact and the article is published complete and unaltered. If you are using this article on a website or e-book, please make sure that the link in the resource box is live and clickable.

Newbie Member
5Oct2007,05:48   #2
McFarnell's Avatar
May I use this code on a web site? Is there some kind of copyright or credit notice I should include? Thanks.
Go4Expert Founder
5Oct2007,08:58   #3
shabbir's Avatar
Quote:
Originally Posted by McFarnell
May I use this code on a web site? Is there some kind of copyright or credit notice I should include? Thanks.
Refer to the last line in the article which says what you should be doing. It should link to the forum and the link should be live and click-able.
Newbie Member
5Oct2007,09:23   #4
McFarnell's Avatar
Thanks. I wasn't sure because that line is referring to use the article, complete and unaltered. I'm not really using the article, just the code. I wasn't sure what the "resource box" was either. So if I just include a live link back to this thread, would that be acceptable?
Go4Expert Founder
5Oct2007,11:03   #5
shabbir's Avatar
Quote:
Originally Posted by McFarnell
Thanks. I wasn't sure because that line is referring to use the article, complete and unaltered. I'm not really using the article, just the code. I wasn't sure what the "resource box" was either. So if I just include a live link back to this thread, would that be acceptable?
Yup.
Banned
20Jun2009,18:14   #6
gkumar's Avatar
This Examlpe to calculate directory size using PHP.

PHP Code:
<?PHP
 
// calculate.directory.class.php
// Credits: BitRepository.com
// URL: [url]http://www.bitrepository.com/web-programming/php/[/url]
// calculate-the-size-number-of-files-folders-of-a-directory.html
 
 
CLASS Directory_Calculator {
 
    VAR 
$size_in;
     VAR 
$decimals;
 
    FUNCTION 
calculate_whole_directory($directory)
    {
        IF (
$handle OPENDIR($directory))
        {
        
$size 0;
          
$folders 0;
          
$files 0;
 
        WHILE (
FALSE !== ($file READDIR($handle)))
          {
            IF (
$file != "." && $file != "..")
               {
                   IF(
IS_DIR($directory.$file))
                   {
                
$array $this->calculate_whole_directory($directory.$file.'/');
                
$size += $array['size'];
                    
$files += $array['files'];
                    
$folders += $array['folders'];
                   }
                   ELSE
                   {
                
$size += FILESIZE($directory.$file);
                    
$files++;
                   }
            }
         }
         
CLOSEDIR($handle);
         }
 
           
$folders++;
 
    RETURN ARRAY(
'size' => $size'files' => $files'folders' => $folders);
    }
 
     FUNCTION 
size_calculator($size_in_bytes)
    {
        IF(
$this->size_in == 'B')
        {
        
$size $size_in_bytes;
        }
        ELSEIF(
$this->size_in == 'KB')
        {
        
$size = (($size_in_bytes 1024));
        }
        ELSEIF(
$this->size_in == 'MB')
        {
        
$size = (($size_in_bytes 1024) / 1024);
        }
        ELSEIF(
$this->size_in == 'GB')
        {
        
$size = (($size_in_bytes 1024) / 1024) / 1024;
        }
 
        
$size ROUND($size$this->decimals);
 
          RETURN 
$size;
     }
 
     FUNCTION 
size($directory)
     {
     
$array $this->calculate_whole_directory($directory);
     
$bytes $array['size'];
     
$size $this->size_calculator($bytes);
     
$files $array['files'];
     
$folders $array['folders'] - 1// exclude the main folder
 
     
RETURN ARRAY('size'    => $size,
                   
'files'   => $files,
                   
'folders' => $folders);
     }
}
?>
 
Here�s an usage example of this class:
 
example.php
 
<?PHP
SET_TIME_LIMIT
(10000);
 
INCLUDE 
'calculate.directory.class.php';
 
/* Path to Directory - IMPORTANT: with '/' at the end */
 
$directory '/home/mywebsite.com/public_html/'
 
/* Calculate size in: B (Bytes), KB (Kilobytes), MB (Megabytes), GB (Gigabytes) */
 
$size_in 'MB';
 
/* Number of decimals to show */
 
$decimals 2;
 
$directory_size = NEW Directory_Calculator;
 
/* Initialize Class */
 
$directory_size->size_in $size_in;
$directory_size->decimals $decimals;
 
// return an array with: size, total files & folders
$array $directory_size->size($directory); 
 
ECHO 
"The directory <em>".$directory."</em> has a size of 
     "
.$array['size']." ".$size_in.", ".$array['files']." files & 
     "
.$array['folders']." folders.";
?>

Last edited by shabbir; 20Jun2009 at 19:06.. Reason: Code blocks
Newbie Member
18Jun2010,17:49   #7
Rosemarieo1's Avatar
You actually can. Go search for the codes, you will need that to do have it calculated. The URL is not working. Can you PM another link for this? Thank you!
Newbie Member
18Jun2010,17:49   #8
Rosemarieo1's Avatar
Refinance a home mortgage
Go4Expert Member
22Jun2010,00:43   #9
loyo's Avatar
It is good, but I would use the later source code.
Go4Expert Member
24Aug2010,20:55   #10
PradeepKr's Avatar
PHP Code:
   $result=explode("\t",exec("du -hs ".$path),2);
    
$result[1]==$path $result[0] : "error";
    echo 
$result[1];