1. We have moved from vBulletin to XenForo and you are viewing the site in the middle of the move. Though the functional aspect of everything is working fine, we are still working on other changes including the new design on Xenforo.
    Dismiss Notice

Calculate directory size using PHP

Discussion in 'PHP' started by pradeep, May 5, 2005.

  1. pradeep

    pradeep Team Leader

    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:
    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:
    $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.
     
    Last edited: May 5, 2005
  2. McFarnell

    McFarnell New Member

    May I use this code on a web site? Is there some kind of copyright or credit notice I should include? Thanks.
     
  3. shabbir

    shabbir Administrator Staff Member

    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.
     
  4. McFarnell

    McFarnell New Member

    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?
     
  5. shabbir

    shabbir Administrator Staff Member

    Yup.
     
  6. gkumar

    gkumar New Member

    This Examlpe to calculate directory size using PHP.

    PHP:
    <?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 a moderator: Jun 20, 2009
  7. Rosemarieo1

    Rosemarieo1 New Member

    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!
     
  8. Rosemarieo1

    Rosemarieo1 New Member

    Refinance a home mortgage
     
  9. loyo

    loyo New Member

    It is good, but I would use the later source code.
     
  10. PradeepKr

    PradeepKr New Member

    PHP:
       $result=explode("\t",exec("du -hs ".$path),2);
        
    $result[1]==$path $result[0] : "error";
        echo 
    $result[1]; 
     

Share This Page