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 — Liefert die Gesamtgröße eines Dateisystemes oder einer Partition
Wenn eine Zeichenkette angegeben wird, die ein Verzeichnis enthält, gibt diese Funktion die Gesamtzahl der Bytes auf dem entsprechenden Dateisystem oder der Partition zurück.
directory
Ein Verzeichnis des Dateisystems oder der Partition.
Gibt die Gesamtanzahl Bytes als Gleitkommazahl (float) zurück.
Bei einem Fehler wird false
zurückgegeben.
Beispiel #1 disk_total_space()-Beispiel
<?php
// $ds enthält die Gesamtanzahl verfügbarer Bytes auf "/"
$ds = disk_total_space("/");
// Unter Windows:
$ds = disk_total_space("C:");
$ds = disk_total_space("D:");
?>
Hinweis: Diese Funktion kann nicht mit entfernten Dateien arbeiten, da der Zugriff auf die Datei, die bearbeitet werden soll, über das Dateisystem des Servers möglich sein muss.
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");
}
?>