【发布时间】:2010-05-07 11:02:37
【问题描述】:
我有一个名为files 的文件夹,我如何确定它的文件大小总和?
【问题讨论】:
标签: php
我有一个名为files 的文件夹,我如何确定它的文件大小总和?
【问题讨论】:
标签: php
使用DirectoryIterator 和SplFileInfo
$totalSize = 0;
foreach (new DirectoryIterator('/path/to/dir') as $file) {
if ($file->isFile()) {
$totalSize += $file->getSize();
}
}
echo $totalSize;
如果您需要包含子文件夹:
$iterator = new RecursiveIteratorIterator(
new RecursiveDirectoryIterator('/path/to/dir')
);
$totalSize = 0;
foreach ($iterator as $file) {
$totalSize += $file->getSize();
}
echo $totalSize;
您可以通过我们提供给format 6000 to 6k 的代码运行$totalSize,以获得更易于阅读的输出。不过,您必须将所有 1000 更改为 1024。
【讨论】:
在遍历所有文件和子目录文件时使用filesize() 来计算文件大小。
<?php
function get_dir_size($dir_name){
$dir_size =0;
if (is_dir($dir_name)) {
if ($dh = opendir($dir_name)) {
while (($file = readdir($dh)) !== false) {
if($file !=”.” && $file != “..”){
if(is_file($dir_name.”/”.$file)){
$dir_size += filesize($dir_name.”/”.$file);
}
/* check for any new directory inside this directory */
if(is_dir($dir_name.”/”.$file)){
$dir_size += get_dir_size($dir_name.”/”.$file);
}
}
}
}
}
closedir($dh);
return $dir_size;
}
$dir_name = “directory name here”;
/* 1048576 bytes == 1MB */
$total_size= round((get_dir_size($dir_name) / 1048576),2) ;
print “Directory $dir_name size : $total_size MB”;
?>
【讨论】:
echo array_sum(array_map('filesize', glob('*')));
【讨论】:
GLOB_NOSORT。请参阅phparch.com/2010/04/28/putting-glob-to-the-test - 这应该会为 glob 增加一些速度。虽然仍然不是最佳的。
array_reduce(glob('?*.?*', GLOB_NOSORT), function($sum,$path){return $sum+filesize($path);}); 表示,使用 DirectoryIterator 或派生类更更漂亮。
如果您可以访问 exec 函数,则可以使用此代码:
exec("du {directory_path_you_want_see_size} -s 2>&1",$output);
echo intval($output[0]) ;
示例:
exec("du /home/ -s 2>&1",$output);
echo intval($output[0]) ;
【讨论】:
exec(),尤其是当它涉及到任何类型的变量、用户提供的输入时。这只是为 shell 命令注入及其所有与安全相关的影响开辟了可能性,而且没有人真正想要这样。但是,如果无法避免,至少指向escapeshellarg() 或其他方式在将用户输入传递给exec() 之前对其进行清理。