首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回月份和年份目录名称和文件夹大小

返回月份和年份目录名称和文件夹大小
EN

Stack Overflow用户
提问于 2013-01-21 22:52:31
回答 2查看 136关注 0票数 1

我有一个包含年份子目录(例如2009年)的目录,在这些子目录中包含月份的子目录(例如02)。

我需要计算每个月文件夹中的总文件,以及每个文件夹的总文件大小,并输出两个总计(总大小和总文件)以及年和月文件夹名称。

示例:

  • 05/2009-512 05 (12宗档案)
  • 06/2009 -45 06 (21宗)
  • 07/2009 - 6MB (8宗档案)
  • 01/2011-54Mb (2份档案)
  • 04/2011-652 04(55个档案)

..。

我已经创建了以下函数,它将计算目录的总大小和文件。我如何调整它以满足多个子文件夹列表,如上文所概述的?

代码语言:javascript
复制
function foldersize($path) {
    $total_size = 0;
    $total_files = 0;

    $files = scandir($path);

    foreach($files as $file) {
        if ($t<>"." && $t <> "..") {
            if (is_dir($path.'/'.$file)) {
                $size = foldersize($path.'/'.$file);
                $total_files++;
                $total_size += $size;
            }
            else {
                $size = filesize($path.'/'.$file);
                $total_files++;
                $total_size += $size;
            }
        }   
    }

    return $total_size.' | '.$total_files;
}
EN

回答 2

Stack Overflow用户

发布于 2013-01-21 23:15:48

您应该查看SPL中提供的recursiveDirectoryIteratorrecursiveIteratorIterator类。这个应该能很好地满足你的需要。

http://php.net/manual/en/class.recursivedirectoryiterator.php http://php.net/manual/en/class.recursiveiteratoriterator.php

样本使用情况:

代码语言:javascript
复制
$path = realpath('/path/to/directory');
$total_files = 0;
$total_filesize = 0;
$dir_files = 0;
$dir_filesize = 0;

$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path, FilesystemIterator::SKIP_DOTS), RecursiveIteratorIterator::SELF_FIRST);
$first_dir = true;
foreach($iterator as $path => $object){
    if ($path->isDir()) {
        // echo out information from last directory
        if (false === $first_dir) {
            echo "Number of Files in Directory: " . $dir_files . "\nTotal File Size of Directory: " . $dir_filesize . " bytes\n\n";
            // reset directory counters
            $dir_files = 0;
            $dir_filesize = 0;
        }
        // start new directory output
        echo $path->getPathname() . "\n";
    } else if ($path->isFile()) {
        $total_filesize += $path->getSize();
        $dir_filesize += $path->getSize();
        $total_files++;
        $dir_files++;
    }
}

echo "\nTotal Files: " . $total_files . "\nTotal File Size: " . $total_filesize . " bytes";
票数 1
EN

Stack Overflow用户

发布于 2013-01-21 23:34:25

您应该使用RecursiveDirectoryIterator递归地遍历子目录。

代码语言:javascript
复制
$_recursiveIterator = new RecursiveDirectoryIterator(
    $path, FilesystemIterator::SKIP_DOTS);
$iterator = new RecursiveIteratorIterator(
    $_recursiveIterator, RecursiveIteratorIterator::SELF_FIRST);
foreach($iterator as $subdirPath => $subdirInfo) {
    if ($subdirInfo->isDir()) {
        echo $subdirPath . ' ' . foldersize($subdirPath);
    }
}

这里发生的事情有点难以理解,SPL迭代器也没有很好的文档,所以我将尝试解释:

  • 迭代器是实现特殊接口的对象,因此可以在foreach循环中使用。
  • RecursiveDirectoryIterator是文件系统的递归迭代器。递归迭代器是一种特殊类型的迭代器,在每次迭代中产生迭代器本身。它们可以用于嵌套数据结构。
  • SKIP_DOTS告诉它忽略...条目
  • RecursiveIteratorIterator用于“扁平化”递归迭代器。它得到一个递归迭代器,并在一个循环中生成所有后续条目。
  • SELF_FIRST是指父母在孩子出生之前(即2009 /01年度之前)
  • 在循环中,键$subdirPath是每个项的路径,值$subdirInfo是一个SplFileInfo对象(实际上,最终从SplFileInfo扩展而来的是RecursiveDirectoryIterator本身--但这一点并不重要)
  • isDir()检查当前项是否为目录

下一步是重构您的foldersize()函数以使用迭代器。它可能是明智的迭代对所有文件和大小计算一次。编辑:看看Mike对这样一个解决方案的回答,上面的解释也适用于此。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14448662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档