Beware of empty files!
<?php
// Wrong
$exp = floor(log($bytes) / log(1024));
//Correct
$exp = $bytes ? floor(log($bytes) / log(1024)) : 0;
?>
(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)
disk_total_space — 返回一个目录的磁盘总大小
给出一个包含有一个目录的字符串,本函数将根据相应的文件系统或磁盘分区返回所有的字节数。 【译者注】本函数返回的是该目录所在的磁盘分区的总大小,因此在给出同一个磁盘分区的不同目录作为参数所得到的结果完全相同。 在 Unix 和 Windows 200x/XP 中都支持将一个磁盘分区加载为一个子目录,这时正确使用本函数就很有意义。
directory
文件系统的目录或者磁盘分区。
以浮点返回一个目录的磁盘总大小字节数, 或者在失败时返回 false
。
示例 #1 disk_total_space() 例子
<?php
// $df 包含 "/" 目录的磁盘大小
$ds = disk_total_space("/");
//在 Windows 下:
$ds = disk_total_space("C:");
$ds = disk_total_space("D:");
?>
注意: 此函数不能作用于远程文件,被检查的文件必须是可通过服务器的文件系统访问的。
Beware of empty files!
<?php
// Wrong
$exp = floor(log($bytes) / log(1024));
//Correct
$exp = $bytes ? floor(log($bytes) / log(1024)) : 0;
?>
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))));
}
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
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]);}
Something that might go well with this function is the ability to list available disks. On Windows, here's the relevant code:
<?php
/**
* Finds a list of disk drives on the server.
* @return array The array velues are the existing disks.
*/
function get_disks(){
if(php_uname('s')=='Windows NT'){
// windows
$disks=`fsutil fsinfo drives`;
$disks=str_word_count($disks,1);
if($disks[0]!='Drives')return '';
unset($disks[0]);
foreach($disks as $key=>$disk)$disks[$key]=$disk.':\\';
return $disks;
}else{
// unix
$data=`mount`;
$data=explode(' ',$data);
$disks=array();
foreach($data as $token)if(substr($token,0,5)=='/dev/')$disks[]=$token;
return $disks;
}
}
?>
EXAMPLE OF USE:
<?php print_r(get_disks()); ?>
EXAMPLE RESULT:
Array
(
[1] => A:\
[2] => C:\
[3] => D:\
[4] => E:\
[5] => F:\
[6] => G:\
[7] => H:\
[8] => I:\
[9] => M:\
[10] => X:\
[11] => Z:\
)
Warning: This also finds empty disk drives (eg; CD or SMD drives or the more common floppy drive).
Warning2: If you want to find space usage using the info from my function, prepend the disk function with the "@", eg:
$free=@disk_free_space('A:\\');
<?php
//This is a more readable way of viewing the returned float
// $Bytes contains the total number of bytes on "/"
$Bytes = disk_total_space("/");
function dataSize($Bytes)
{
$Type=array("", "kilo", "mega", "giga", "tera");
$counter=0;
while($Bytes>=1024)
{
$Bytes/=1024;
$counter++;
}
return("".$Bytes." ".$Type[$counter]."bytes");
}
?>