没想到啊

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  6 随笔 :: 379 文章 :: 97 评论 :: 24万 阅读
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

SplFileInfo类的作用在于为文件或者目录的属性提供面向对象的访问功能,其典型应用是获取文件或者文件夹的信息。


SplFileInfo类提供了两个关键的方法以支持对它的扩展:


1. setInfoClass:这个函数默认指向SplFileInfo类,如果扩展了SplFileInfo类,应该将这个值设置为扩展类的名称。


2. setFileClass:这个函数默认执行一个SplFileObject类,如果扩展了这个类,应该设置这个值以确保扩展类正式调用SplFileInfo类的代码提供的类。


这两个方法对getFileInfo()、getPathInfo()和openFile()等方法的操作会产生影响。


DirectoryIterator迭代器和SplFileObject类都是从SplFileInfo类继承的,getFileInfo()方法提供了在迭代器中访问某个特定文件的信息的办法,还可以将一个文件对象转换为一个文件信息对象。openFile()方法将访问文件并返回一个SplFileInfo对象,这个对象可以被用来在文件中执行操作。


DirectoryIterator迭代器提供了访问某个目录内容列表的功能,它的current()方法会为目录中的当前项返回一个SplFileInfo对象。


使用SplFileInfo对象和DirectoryIterator迭代器示例:


view plaincopy to clipboardprint?

$pathName = '/path/source/iterator/';  

  

foreach (new DirectoryIterator($pathName) as $fileInfo) {  

    if (!$fileInfo->isDot()) {   //判断当前项是否当前文件夹或者父文件夹  

        echo $fileInfo . "\n";   //调用了SplFileInfo的__toString()方法  

    }  

}  


RecursiveDirectoryIterator迭代器提供了递归式迭代访问功能,以及确定某个路径是否含有子目录的方法。


使用RecursiveDirectoryIterator迭代器范例:


view plaincopy to clipboardprint?

$pathName = '/path/source/iterator/';  

$iterator = new RecursiveDirectoryIterator($pathName);  

$it = new RecursiveIteratorIterator($iterator);  

print_r(iterator_to_array($it, false));  


创建自定义文件过滤器:只需要创建从FilterIterator迭代器继承并且实现accept()方法就可以了。


查找特定类型文件的范例代码:


view plaincopy to clipboardprint?

class FileExtensionFinder extends FilterIterator  

{  

    protected $predicate, $path;  

  

    public function __construct($path, $predicate)  

    {  

        $this->predicate = $predicate;  

        $this->path = $path;  

  

        $it = new RecursiveDirectoryIterator($path);  

        $flatIterator = new RecursiveIteratorIterator($it);  

  

        parent::__construct($flatIterator);  

    }  

  

    public function accept()  

    {  

        $pathInfo = pathinfo($this->current());  

        $extension = $pathInfo['extension'];  

        return ($extension == $this->predicate);  

    }  

}  

  

$it = new FileExtensionFinder('/path/source/iterator', 'php');  

  

foreach ($it as $entry) {  

    echo $entry . "\n";  

}  


SplFileObject类将PHP文件中的I/O函数综合在一起如fopen()、fread()等函数,形成了一个多功能的面向对象的接口。可以使用这个类以面向对象的方法来读取和操作文件数据。


SplFileObject也是一个迭代器,并且还是可查找的,这允许通过foreach循环来使用文件的内容。


以行为单位的迭代访问代码范例:


view plaincopy to clipboardprint?

$it = new SplFileObject('example.csv');  

  

foreach($it as $line) {  

    echo $line . "\n";  

}  


CSV解释操作代码范例:


view plaincopy to clipboardprint?

$it = new SplFileObject('example.csv');  

  

while($array = $it->fgetcsv()) {  

    var_export($array);  

}  


结合SPL的示例代码,使用SPL的文件和目录特性,还可以实现查找文件、文件内容的搜索等功能。

posted on   没想到啊  阅读(477)  评论(0编辑  收藏  举报
编辑推荐:
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· .NET周刊【3月第1期 2025-03-02】
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· [AI/GPT/综述] AI Agent的设计模式综述
点击右上角即可分享
微信分享提示