Calculate directory size using PHP

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

  1. pradeep

    pradeep Team Leader

    Joined:
    Apr 4, 2005
    Messages:
    1,645
    Likes Received:
    87
    Trophy Points:
    0
    Occupation:
    Programmer
    Location:
    Kolkata, India
    Home Page:
    http://blog.pradeep.net.in
    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

    Joined:
    Oct 5, 2007
    Messages:
    2
    Likes Received:
    0
    Trophy Points:
    0
    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

    Joined:
    Jul 12, 2004
    Messages:
    15,375
    Likes Received:
    388
    Trophy Points:
    83
    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

    Joined:
    Oct 5, 2007
    Messages:
    2
    Likes Received:
    0
    Trophy Points:
    0
    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

    Joined:
    Jul 12, 2004
    Messages:
    15,375
    Likes Received:
    388
    Trophy Points:
    83
    Yup.
     
  6. gkumar

    gkumar New Member

    Joined:
    Jun 16, 2009
    Messages:
    58
    Likes Received:
    5
    Trophy Points:
    0
    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

    Joined:
    Jun 18, 2010
    Messages:
    2
    Likes Received:
    0
    Trophy Points:
    0
    Home Page:
    http://refinanceahomemortgage.org/
    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

    Joined:
    Jun 18, 2010
    Messages:
    2
    Likes Received:
    0
    Trophy Points:
    0
    Home Page:
    http://refinanceahomemortgage.org/
    Refinance a home mortgage
     
  9. loyo

    loyo New Member

    Joined:
    Feb 12, 2010
    Messages:
    36
    Likes Received:
    0
    Trophy Points:
    0
    Home Page:
    http://bbs.prog365.com
    It is good, but I would use the later source code.
     
  10. PradeepKr

    PradeepKr New Member

    Joined:
    Aug 24, 2010
    Messages:
    24
    Likes Received:
    0
    Trophy Points:
    0
    Home Page:
    http://www.expertsguide.info
    PHP:
       $result=explode("\t",exec("du -hs ".$path),2);
        
    $result[1]==$path $result[0] : "error";
        echo 
    $result[1]; 
     

Share This Page

  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice