Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 回显所有文件的组合大小_Php_Directory_Filesize - Fatal编程技术网

Php 回显所有文件的组合大小

Php 回显所有文件的组合大小,php,directory,filesize,Php,Directory,Filesize,我有这个脚本,除了一个小问题。基本上,它获取指定目录中所有文件的总大小,但不包括文件夹 我的目录结构像 上传 ->客户01 ->另一个客户 ->其他客户 …等等 每个文件夹都包含各种文件,因此我需要脚本查看“uploads”目录,并给出所有文件和文件夹的大小 <?php $total = 0; //Total File Size //Open the dir w/ opendir(); $filePath = "uploads/" . $_POST["USER_NAME"] .

我有这个脚本,除了一个小问题。基本上,它获取指定目录中所有文件的总大小,但不包括文件夹

我的目录结构像

上传 ->客户01 ->另一个客户 ->其他客户

…等等

每个文件夹都包含各种文件,因此我需要脚本查看“uploads”目录,并给出所有文件和文件夹的大小

<?php      
$total = 0; //Total File Size
//Open the dir w/ opendir();
$filePath = "uploads/" . $_POST["USER_NAME"] . "/";
$d = opendir( $filePath ); //Or use some other path.
    if( $d ) {
while ( false !== ( $file = readdir( $d ) ) ) { //Read the file list
   if (is_file($filePath.$file)){
$total+=filesize($filePath.$file);
   }
}
closedir( $d ); //Close the direcory
    echo number_format($total/1048576, 2);
    echo ' MB<br>';
}
else {
    echo "didn't work";
}
?>
试试这个:

exec("du -s $filepath",$a);
$size = (int)$a[0]; // gives the size in 1k blocks
不过,请确保验证了
$\u POST[“USER\u NAME”]
,否则可能会导致严重的安全漏洞。(例如,
$\u POST[“用户名”]=“rm-r/*”

尝试以下方法:

exec("du -s $filepath",$a);
$size = (int)$a[0]; // gives the size in 1k blocks

不过,请确保验证了
$\u POST[“USER\u NAME”]
,否则可能会导致严重的安全漏洞。(例如,
$\u POST[“用户名”]=“rm-r/*”

最简单的方法是设置递归函数

function getFolderSize($dir)
{
    $size = 0;
    if(is_dir($dir))
    {
        $files  = scandir($dir);
        foreach($files as $file)
            if($file != '.' && $file != '..')
                if(filetype($dir.DIRECTORY_SEPARATOR.$file) == 'dir')
                    $size += getFolderSize($dir.DIRECTORY_SEPARATOR.$file);
                else
                    $size += filesize($dir.DIRECTORY_SEPARATOR.$file);
    }
    return $size;
}

编辑我现在修复的代码中有一个小错误

最简单的方法是设置递归函数

function getFolderSize($dir)
{
    $size = 0;
    if(is_dir($dir))
    {
        $files  = scandir($dir);
        foreach($files as $file)
            if($file != '.' && $file != '..')
                if(filetype($dir.DIRECTORY_SEPARATOR.$file) == 'dir')
                    $size += getFolderSize($dir.DIRECTORY_SEPARATOR.$file);
                else
                    $size += filesize($dir.DIRECTORY_SEPARATOR.$file);
    }
    return $size;
}
编辑我现在修复的代码中有一个小错误

在这里面查找关键字目录:一个人有一个很棒的函数,可以计算目录的大小

或者,
如果读取的文件是目录,则可能必须进行递归或循环

浏览一下这里面的关键字目录:一个人有一个很棒的函数,可以计算目录的大小

或者,
如果读取的文件是目录,则可能必须进行递归或循环


通过

我会使用一些SPL

$filePath = "uploads/" . $_POST["USER_NAME"];

$total = 0;
$d = new RecursiveIteratorIterator(
  new RecursiveDirectoryIterator($filePath), 
  RecursiveIteratorIterator::SELF_FIRST
);

foreach($d as $file){
  $total += $file->getSize();
}

echo number_format($total/1048576, 2);
echo ' MB<br>';
$filePath=“uploads/”$_POST[“用户名”];
$total=0;
$d=新的递归迭代器(
新的递归DirectoryIterator($filePath),
递归迭代器::SELF_优先
);
foreach($d作为$file){
$total+=$file->getSize();
}
回音号码_格式($total/1048576,2);
回声“MB
”;
我会使用一些SPL

$filePath = "uploads/" . $_POST["USER_NAME"];

$total = 0;
$d = new RecursiveIteratorIterator(
  new RecursiveDirectoryIterator($filePath), 
  RecursiveIteratorIterator::SELF_FIRST
);

foreach($d as $file){
  $total += $file->getSize();
}

echo number_format($total/1048576, 2);
echo ' MB<br>';
$filePath=“uploads/”$_POST[“用户名”];
$total=0;
$d=新的递归迭代器(
新的递归DirectoryIterator($filePath),
递归迭代器::SELF_优先
);
foreach($d作为$file){
$total+=$file->getSize();
}
回音号码_格式($total/1048576,2);
回声“MB
”;
我快速比较了我的函数和@Shrinath引用的函数,它们都很快;递归迭代器的速度约为16%,但占用的内存约为11%(通过我的即兴测试)。使用适量的盐,我快速比较了我的函数和@Shrinath引用的函数,它们都很快;递归迭代器的速度约为16%,但占用的内存约为11%(通过我的即兴测试)。使用适量的盐这绝对是我在命令行上要做的。不过,除非真的有必要,否则我有点反对exec。相比之下,如果使用@Patrick的答案真的很慢的话,我才会这样做。@zanlok很公平。避开高管是件好事。尽管如此,我还是喜欢这个解决方案的紧凑性。此外,在更一般的情况下,可能存在符号链接和目录被多次计数的问题
du
自动解决这些问题。同意所有计数。谢谢你提供的额外信息。这绝对是我在命令行上要做的。不过,除非真的有必要,否则我有点反对exec。相比之下,如果使用@Patrick的答案真的很慢的话,我才会这样做。@zanlok很公平。避开高管是件好事。尽管如此,我还是喜欢这个解决方案的紧凑性。此外,在更一般的情况下,可能存在符号链接和目录被多次计数的问题
du
自动解决这些问题。同意所有计数。谢谢你提供的额外信息。工作得很有魅力。非常感谢,太棒了。工作得很有魅力。非常感谢。