PHP 8.3.4 Released!

disk_free_space

(PHP 4 >= 4.1.0, PHP 5, PHP 7, PHP 8)

disk_free_spaceファイルシステムあるいはディスクパーティション上で利用可能な領域を返す

説明

disk_free_space(string $directory): float|false

ディレクトリを指定することにより、 この関数は対応するファイルシステムまたはディスクパーティションで 利用可能なバイト数を返します。

パラメータ

directory

ファイルシステムのディレクトリあるいはディスクパーティション。

注意:

ディレクトリのかわりにファイル名を指定したときの挙動は未定義です。 OS や PHP のバージョンによって結果は異なります。

戻り値

利用可能なバイト数を float 型で返します。 失敗した場合に false を返します。

例1 disk_free_space() の例

<?php
// $df は「/」で利用可能なバイト数となります。
$df = disk_free_space("/");

// Windows の場合:
$df_c = disk_free_space("C:");
$df_d = disk_free_space("D:");
?>

注意

注意: この関数では、 リモートファイル を 使用することはできません。これは、処理されるファイルがサーバーの ファイルシステムによりアクセスできる必要があるためです。

参考

  • disk_total_space() - ファイルシステムあるいはディスクパーティションの全体サイズを返す

add a note

User Contributed Notes 9 notes

up
62
wiede at gmx dot net
12 years ago
Transformation is possible WITHOUT using loops:

<?php
$bytes
= disk_free_space(".");
$si_prefix = array( 'B', 'KB', 'MB', 'GB', 'TB', 'EB', 'ZB', 'YB' );
$base = 1024;
$class = min((int)log($bytes , $base) , count($si_prefix) - 1);
echo
$bytes . '<br />';
echo
sprintf('%1.2f' , $bytes / pow($base,$class)) . ' ' . $si_prefix[$class] . '<br />';
?>
up
32
Anonymous
9 years ago
$si_prefix = array( 'B', 'KB', 'MB', 'GB', 'TB', 'EB', 'ZB', 'YB' );

you are missing the petabyte after terabyte

'B', 'KB', 'MB', 'GB', 'TB', 'EB', 'ZB', 'YB'

should look like

'B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'
up
17
sam
15 years ago
Nice, but please be aware of the prefixes.

SI specifies a lower case 'k' as 1'000 prefix.
It doesn't make sense to use an upper case 'K' as binary prefix,
while the decimal Mega (M and following) prefixes in SI are uppercase.
Furthermore, there are REAL binary prefixes since a few years.

Do it the (newest and recommended) "IEC" way:

KB's are calculated decimal; power of 10 (1000 bytes each)
KiB's are calculated binary; power of 2 (1024 bytes each).
The same goes for MB, MiB and so on...

Feel free to read:
http://en.wikipedia.org/wiki/Binary_prefix
up
11
Nitrogen
17 years ago
Another easy way to convert bytes to human readable sizes would be this:

<?php
function HumanSize($Bytes)
{
$Type=array("", "kilo", "mega", "giga", "tera", "peta", "exa", "zetta", "yotta");
$Index=0;
while(
$Bytes>=1024)
{
$Bytes/=1024;
$Index++;
}
return(
"".$Bytes." ".$Type[$Index]."bytes");
}
?>

It simply takes the $Bytes and divides it by 1024 bytes untill it's no longer over or equal to 1024, meanwhile it increases the $Index to allocate which suffix belongs to the return (adding 'bytes' to the end to save some space).
You can easily modify it so it's shorter, but I made it so it's more clearer.

Nitrogen.
up
8
root at mantoru dot de
16 years ago
Note that disk_free_space() does an open_basedir check.
up
0
Jawira Portugal
2 years ago
This is not documented yet.
If $directory is invalid, then disk_free_space() will return false and ALSO throw a Warning: "disk_free_space(): No such file or directory"
up
-1
somedude
7 years ago
With respect to Linux filesystems, I'll point out that this function returns the space available in the current volume or mountpoint, not the total physical disk space. That is, this function used on the '/root' volume shows the free space in /root, which is different from '/home', and so on.
up
-13
Matthieu S
7 years ago
On Windows, this also works with distant files, by using their full network path.

For instance, this will give the % of free disk space on the share "dir" from remote host "server" :
<?php
$path
= "\\\\server\\dir";
echo(
floor(100 * disk_free_space($disk) / disk_total_space($disk)));
?>

It can also work with drive letters mapped to a network path in certain cases.
up
-14
pavel at sunhater dot com
4 years ago
<?php

function size($size, array $options=null) {

$o = [
'binary' => false,
'decimalPlaces' => 2,
'decimalSeparator' => '.',
'thausandsSeparator' => '',
'maxThreshold' => false, // or thresholds key
'sufix' => [
'thresholds' => ['', 'K', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y'],
'decimal' => ' {threshold}B',
'binary' => ' {threshold}iB'
]
];

if (
$options !== null)
$o = array_replace_recursive($o, $options);

$count = count($o['sufix']['thresholds']);
$pow = $o['binary'] ? 1024 : 1000;

for (
$i = 0; $i < $count; $i++)

if ((
$size < pow($pow, $i + 1)) ||
(
$i === $o['maxThreshold']) ||
(
$i === ($count - 1))
)
return

number_format(
$size / pow($pow, $i),
$o['decimalPlaces'],
$o['decimalSeparator'],
$o['thausandsSeparator']
) .

str_replace(
'{threshold}',
$o['sufix']['thresholds'][$i],
$o['sufix'][$o['binary'] ? 'binary' : 'decimal']
);
}

var_dump(size(disk_free_space('/')));
// string(8) "14.63 GB"
var_dump(size(disk_free_space('/'), ['binary' => true]));
// string(9) "13.63 GiB"
var_dump(size(disk_free_space('/'), ['maxThreshold' => 2]));
// string(11) "14631.90 MB"
var_dump(size(disk_free_space('/'), ['binary' => true, 'maxThreshold' => 2]));
// string(12) "13954.07 MiB"

?>
To Top