PHP获取目录中的全部内容RecursiveDirectoryIterator

PHP获取目录中的全部内容RecursiveDirectoryIterator

这次我们来介绍一个SPL库中的目录迭代器,它的作用其实非常简单,从名字就可以看出来,就是获取指定目录下的所有内容。之前我们要遍历目录获取目录及目录下的所有文件一般是需要进行递归遍历的,自己写这个代码说实话还是挺麻烦的,所以PHP为我们准备好了这一套内置API,当输入指定的目录后,直接返回该目录下所有子目录及文件内容。当然,并不是树型的,顺序并不一定,想要组织成树型还需要我们自己再进行处理。

话不多说,直接看代码:

$path = $argv[1];

// 获取目录下所有内容
$dirs = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path), RecursiveIteratorIterator::SELF_FIRST);

foreach($dirs as $k=>$d){
    echo 'key:'. $k, PHP_EOL;
    if($d->isDir()){
        echo $d->getPathname(), PHP_EOL;
    }else{
        echo $d->getFilename(), PHP_EOL;
    }
}

//执行 php PHP获取目录中的全部内容RecursiveDirectoryIterator.php ../

// key:../.
// ../.
// key:../..
// ../..
// key:../source
// ../source
// key:../source/.
// ../source/.
// key:../source/..
// ../source/..
// key:../source/PHP获取目录中的全部内容RecursiveDirectoryIterator.php
// PHP获取目录中的全部内容RecursiveDirectoryIterator.php
// key:../source/PHP大文件读取操作.php
// PHP大文件读取操作.php
// key:../PHP大文件读取操作.md
// PHP大文件读取操作.md
// key:../PHP获取目录中的全部内容RecursiveDirectoryIterator.md
// PHP获取目录中的全部内容RecursiveDirectoryIterator.md

其实就一行代码,然后直接循环输出这个迭代器。从结果中我们可以看出,先进入 source 目录遍历完成后再遍历外部的文件内容,按照目录、文件名的顺序依次获取了目录下的所有内容。是不是比我们自己写递归函数要方便很多。

如果我们想获取目录下的所有PHP文件,并且计算他们的文件总大小呢?使用这一套迭代器操作也可以非常简单的完成,我们只需要增加一个正则迭代器对前面的迭代器内容进行一下过滤就好了:

// 获取所有php文件
$regIts = new RegexIterator($dirs, '/^.+\.php$/i');
$fileSize = 0;
foreach($regIts as $k=>$p){
    echo $p->getSize() . ' ' .  $k, PHP_EOL;
    $fileSize += $p->getSize();
}
echo 'Total ', $fileSize, PHP_EOL;

// 622 ../source/PHP获取目录中的全部内容RecursiveDirectoryIterator.php
// 869 ../source/PHP大文件读取操作.php
// Total 1491

感觉就和 ls -l 一样,可以方便的让我们能够进行目录下的相关操作。这个类的使用就简单的介绍到这里,关于SPL库中还有许多值得我们探索的能力,慢慢学习慢慢实践,不断提升我们面向优雅编程的能力。

测试代码:https://github.com/zhangyue0503/dev-blog/blob/master/php/202003/source/PHP%E8%8E%B7%E5%8F%96%E7%9B%AE%E5%BD%95%E4%B8%AD%E7%9A%84%E5%85%A8%E9%83%A8%E5%86%85%E5%AE%B9RecursiveDirectoryIterator.php

参考文档:《PHP7编程实战》https://www.php.net/manual/en/class.recursivedirectoryiterator.phphttps://www.php.net/manual/en/class.splfileinfo.php

(0)

相关推荐

  • 在PHP中灵活使用foreach+list处理多维数组

    先抛出问题,有时候我们接收到的参数是多维数组,我们需要将他们转成普通的数组,比如: $arr = [ [1, 2, [3, 4]], [5, 6, [7, 8]],]; 我们需要的结果是元素1变成1, ...

  • 注意!PHP中字符串与数字的比较

    在日常开发过程中,运算符是我们每天都会接触到的.这个运算符中其实埋了非常多的坑,今天我们就来看下字符串和数字用比较需要注意的问题. 首先来看看这些代码: echo '"1234" ...

  • 彻底搞明白PHP中的include和require

    在PHP中,有两种包含外部文件的方式,分别是include和require.他们之间有什么不同呢? 如果文件不存在或发生了错误,require产生E_COMPILE_ERROR级别的错误,程序停止运行 ...

  • PHP中命名空间是怎样的存在(一)?

    命名空间其实早在PHP5.3就已经出现了.不过大部分同学可能在各种框架的使用中才会接触到命名空间的内容,当然,现代化的开发也都离不开这些能够快速产出的框架.这次我们不从框架的角度,仅从简单的代码角度来 ...

  • final关键字在PHP中的使用

    final关键字的使用非常简单,在PHP中的最主要作用是定义不可重写的方法.什么叫不可重写的方法呢?就是子类继承后也不能重新再定义这个同名的方法. class A { final function t ...

  • 标梵学习PHP的压缩工具扩展包

    PHP的zip压缩工具扩展包学习 总算到了 PHP 的拿手好戏上场了,前面我们学习过 Bzip2 . LZF . Phar 和 rar 这些压缩相关扩展在 PHP 中的使用,不过它们要么是太冷门,要么 ...

  • [PHP小课堂]PHP获取目录中的全部内容

    [PHP小课堂]PHP获取目录中的全部内容 关注公众号:[硬核项目经理]获取最新文章 添加微信/QQ好友:[xiaoyuezigonggong/149844827]免费得PHP.项目管理学习资料 B站 ...

  • 获取单元格区域中最长内容的单元格数据

    本次的练习是:如下图1所示的工作表,在单元格区域A1:A7中有一组数据,如何使用公式获取该区域中最长内容的单元格数据?即单元格A2包含的文本"excelperfect". 图1 先 ...

  • Excel公式技巧72:获取一列中单元格内容的最大长度

    excelperfect 一列数据,我们想知道这列中单元格内容最长的文本长度值.通常,可能会在旁边的列中使用LEN函数求得每个单元格文本的长度,然后再使用MAX函数获得最大长度值,如下图1所示. 图1 ...

  • 教学管理菜鸟成长记80-如何获取PDF中的文字之上集

    教务处王处长经常教育小菜,工作不仅要脚踏实地,而且要仰望星空.小菜做好日常工作之余,时不时也琢磨写专业论文提升一下自己. 这不前天早上,小菜在等班车的寒风中身体抖动取暖时感慨--今年剩下不到一百天了! ...

  • 教学管理菜鸟成长记81-如何获取PDF中的文字之下集

    关键词:PDF批量转WORD:AnyBizSoft_PDF_Converter:操作难度*** 各位看官早上好!小菜首先回复昨天埋的伏笔(请参阅<教学管理菜鸟成长记81-如何获取PDF中的文字之 ...

  • 告别复制粘贴,教你一招批量汇总文档中的表格内容

    提到邮件合并功能,想必大家都不会陌生.它可以帮助我们把表格中的内容批量导入到文档模板里,从而批量产生文档. 那邮件合并能否逆向操作 ,把多个文档里的指定内容汇总到表格呢? 答案是可以的!因为 WPS ...

  • 《古文观止》中的精髓内容,经典名句等你来解读

    <古文观止>是古人编写的一本启蒙读物,全书按时代先后分为7个时期,每个时期都有重点作家和作品.其中不乏陶渊明.韩愈.柳宗元.欧阳修.苏轼等名家的大作,<左传>.<史记&g ...

  • 提取中每组内容中的金额

    需求说明:提取中每组内容中的金额! 需求不难,你是怎么做的呢?要是你是一个一个看着填到旁边的,那么你真的需要看下去,我应该会讲很多方法!从简单到函数处理! 方案1 |  听说没有一个问题是快速填充解决 ...

  • 检查中常见提问内容

    检查中常见提问内容 一.学校管理要精细化,校长清楚学校底数: 1.学校占地面积多少?建筑面积多少?总共有多少学生?一共有几个班?最大班额是多少?平均班额是多少?男女生比例是多少? 2.学校有多少教师? ...