共计 1856 个字符,预计需要花费 5 分钟才能阅读完成。
这次咱们来介绍一个 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.php
https://www.php.net/manual/en/class.splfileinfo.php
===========
各自媒体平台均可搜寻【硬核项目经理】