没想到啊

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

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 2012-01-18 18:21  没想到啊  阅读(461)  评论(0编辑  收藏  举报