Delicious Bookmark this on Delicious Share on Facebook SlashdotSlashdot It! Digg! Digg



PHP : Function Reference : Filesystem Functions : disk_total_space

disk_total_space

Returns the total size of a directory (PHP 4 >= 4.0.7, PHP 5)
float disk_total_space ( string directory )

Example 623. disk_total_space() example

<?php
// $df contains the total number of bytes available on "/"
$df = disk_total_space("/");

// On Windows:
disk_total_space("C:");
disk_total_space("D:");
?>

Related Examples ( Source code ) » disk_total_space


Code Examples / Notes » disk_total_space

nikolayku

Very simple function that convert bytes to kilobytes, megabytes ...
function ConvertBytes($number)
{
$len = strlen($number);
if($len < 4)
{
return sprintf("%d b", $number);
}
if($len >= 4 && $len <=6)
{
return sprintf("%0.2f Kb", $number/1024);
}
if($len >= 7 && $len <=9)
{
return sprintf("%0.2f Mb", $number/1024/1024);
}

return sprintf("%0.2f Gb", $number/1024/1024/1024);

}


andudi

To find the total size of a file/directory you have to differ two situations:
(on Linux/Unix based systems only!?)
you are interested:
1) in the total size of the files in the dir/subdirs
2) what place on the disk your dir/subdirs/files uses
- 1) and 2) normaly differs, depending on the size of the inodes
- mostly 2) is greater than 1) (in the order of any kB)
- filesize($file) gives 1)
- "du -ab $file" gives 2)
so you have to choose your situation!
on my server I have no rights to use "exec du" in the case of 2), so I use:
 $s = stat($file);
 $size = $s[11]*$s[12]/8);
whitch is counting the inodes [12] times the size of them in Bits [11]
hopes this helps to count the used disk place in a right way... :-)
                    Andreas Dick


martijn

This works for me (on a UNIX server):
<?php
function du( $dir )
{
   $res = `du -sk $dir`;             // Unix command
   preg_match( '/\d+/', $res, $KB ); // Parse result
   $MB = round( $KB[0] / 1024, 1 );  // From kilobytes to megabytes
   return $MB;
}
$dirSize = du('/path/to/dir/');
?>


shalless

My first contribution. Trouble is the sum of the byte sizes of the files in your directories is not equal to the amount of disk space consumed, as andudi points out. A 1-byte file occupies 4096 bytes of disk space if the block size is 4096. Couldn't understand why andudi did $s["blksize"]*$s["blocks"]/8. Could only be because $s["blocks"] counts the number of 512-byte disk blocks not the number of $s["blksize"] blocks, so it may as well just be $s["blocks"]*512. Furthermore none of the dirspace suggestions allow for the fact that directories are also files and that they also consume disk space. The following code dskspace addresses all these issues and can also be used to return the disk space consumed by a single non-directory file. It will return much larger numbers than you would have been seeing with any of the other suggestions but I think they are much more realistic:
<?php
function dskspace($dir)
{
  $s = stat($dir);
  $space = $s["blocks"]*512;
  if (is_dir($dir))
  {
    $dh = opendir($dir);
    while (($file = readdir($dh)) !== false)
      if ($file != "." and $file != "..")
        $space += dskspace($dir."/".$file);
    closedir($dh);
  }
  return $space;
}
?>


mat

JulieC:
I think you may have misunderstood - given a directory, this function tells you how big the disk paritition is that the directory exists on.
So disk_total_space("C:\Windows\") will tell you how big drive C is.
It is not suggesting that a directory is a disk partition.


kit

I just did the simple thing -
<?php
function du($dir)
{
   $du = popen("/usr/bin/du -sk $dir", "r");
   $res = fgets($du, 256);
   pclose($du);
   $res = explode(" ", $res);
   
   return $res[0];
}
?>


stierguy1

function roundsize($size){
$i=0;
$iec = array("B", "Kb", "Mb", "Gb", "Tb");
while (($size/1024)>1) {
$size=$size/1024;
$i++;}
return(round($size,1)." ".$iec[$i]);}


tularis

For a non-looping way to add symbols to a number of bytes:
<?php
function getSymbolByQuantity($bytes) {
$symbols = array('B', 'KiB', 'MiB', 'GiB', 'TiB', 'PiB', 'EiB', 'ZiB', 'YiB');
$exp = floor(log($bytes)/log(1024));
return sprintf('%.2f '.$symbol[$exp], ($bytes/pow(1024, floor($exp))));
}


juliec

"filesystem or disk partition" does not equal "directory" for Windows.  Thanks.

Change Language


Follow Navioo On Twitter
basename
chgrp
chmod
chown
clearstatcache
copy
delete
dirname
disk_free_space
disk_total_space
diskfreespace
fclose
feof
fflush
fgetc
fgetcsv
fgets
fgetss
file_exists
file_get_contents
file_put_contents
file
fileatime
filectime
filegroup
fileinode
filemtime
fileowner
fileperms
filesize
filetype
flock
fnmatch
fopen
fpassthru
fputcsv
fputs
fread
fscanf
fseek
fstat
ftell
ftruncate
fwrite
glob
is_dir
is_executable
is_file
is_link
is_readable
is_uploaded_file
is_writable
is_writeable
lchgrp
lchown
link
linkinfo
lstat
mkdir
move_uploaded_file
parse_ini_file
pathinfo
pclose
popen
readfile
readlink
realpath
rename
rewind
rmdir
set_file_buffer
stat
symlink
tempnam
tmpfile
touch
umask
unlink
eXTReMe Tracker