我有一个包含年份子目录(例如2009年)的目录,在这些子目录中包含月份的子目录(例如02)。
我需要计算每个月文件夹中的总文件,以及每个文件夹的总文件大小,并输出两个总计(总大小和总文件)以及年和月文件夹名称。
示例:
..。
我已经创建了以下函数,它将计算目录的总大小和文件。我如何调整它以满足多个子文件夹列表,如上文所概述的?
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;
}发布于 2013-01-21 23:15:48
您应该查看SPL中提供的recursiveDirectoryIterator和recursiveIteratorIterator类。这个应该能很好地满足你的需要。
http://php.net/manual/en/class.recursivedirectoryiterator.php http://php.net/manual/en/class.recursiveiteratoriterator.php
样本使用情况:
$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";发布于 2013-01-21 23:34:25
您应该使用RecursiveDirectoryIterator递归地遍历子目录。
$_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本身--但这一点并不重要)下一步是重构您的foldersize()函数以使用迭代器。它可能是明智的迭代对所有文件和大小计算一次。编辑:看看Mike对这样一个解决方案的回答,上面的解释也适用于此。
https://stackoverflow.com/questions/14448662
复制相似问题