`

php中的DirectoryIterator和RecursiveDirectoryIterator

    博客分类:
  • PHP
php 
阅读更多
php中,可以用用DirectoryIterator获取指定目录的文件或者目录.
$path = "/tmp";  
$oDir = new DirectoryIterator($path);  
foreach($oDir as $file)  
{  
  if($file->isfile())  
  {  
    $tmpFile['link'] = $file->getPath();  
    $tmpFile['name'] = $file->getFileName();  
    $tmpFile['type'] = 'file';  
    $tmpFile['size'] = _cal_size($file->getSize());  
    $tmpFile['mtime'] = $file->getMTime();  
    $arrFile[] = $tmpFile;  
  }  
}  
print_r($arrFile);  
/* output 
Array 
( 
    [0] => Array 
        ( 
            [link] => /tmp 
            [name] => scim-panel-socket-:0-root 
            [type] => dir 
            [size] => 0b 
            [mtime] => 1222049895 
        ) 
 
    [1] => Array 
        ( 
            [link] => /tmp 
            [name] => .font-unix 
            [type] => dir 
            [size] => 4k 
            [mtime] => 1241417372 
        ) 
) 
*/  


RecursiveDirectoryIterator 获取目录下所有的文件,包括子目录 ,其中搭配:
RecursiveIteratorIterator使用.
(RecursiveIteratorIterator是个递归迭代器,其后可选带四个参数(只能任一)

RecursiveIteratorIterator::LEAVES_ONLY
默认,已在__construct中设定使用
作用是去枝留叶,跳过空节点,只递归取实值
举例就是
1.递归文件夹取文件时跳过文件夹本身,只取文件夹下面的文件,输出的项全部是file(文件和各级子文件夹的文件)
2.多维数组就跳过前几维的key,而取value,输出的每一项都不是array
3.XML只取值(text),不输出节点名,当然还要视乎你设定获取xml什么内容

RecursiveIteratorIterator::SELF_FIRST
各项都包含,例如递归文件夹就会连同子文件夹名称也作为其中项输出,顺序是先父后子

RecursiveIteratorIterator::CHILD_FIRST
同上,但顺序是先子后父,./test/test.php会在./test(文件夹)前面)

$path = "/tmp/"; 
$objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)); 
foreach($objects as $object) 

  $tmpFile['link'] = $object->getPath(); 
  $tmpFile['name'] = $object->getFileName(); 
  $tmpFile['type'] = $object->isFile() ? 'file' : 'dir'; 
  $tmpFile['size'] = _cal_size($object->getSize()); 
  $tmpFile['mtime'] = $object->getMTime(); 
  $arrFile[] = $tmpFile; 

print_r($arrFile); 
/*
output:
Array
(
    [0] => Array
        (
            [link] => /tmp
            [name] => scim-panel-socket-:0-root
            [type] => dir
            [size] => 0b
            [mtime] => 1222049895
        )

    [1] => Array
        (
            [link] => /tmp/.font-unix
            [name] => fs7100
            [type] => dir
            [size] => 0b
            [mtime] => 1241417372
        )
)
*/ 

再来看个例子:
<?php

/*** the target directory, no trailling slash ***/
$directory = './';

try
    {
        /*** check if we have a valid directory ***/
        if( !is_dir($directory) )
        {
            throw new Exception('Directory does not exist!'."\n");
        }

        /*** check if we have permission to rename the files ***/
        if( !is_writable( $directory ))
        {
            throw new Exception('You do not have renaming permissions!'."\n");
        }

   
        /**
        *
        * @collapse white space
        *
        * @param string $string
        *
        * @return string
        *
        */
        function collapseWhiteSpace($string)
        {
            return  preg_replace('/\s+/', ' ', $string);
        }

        /**
        * @convert file names to nice names
        *
        * @param string $filename
        *
        * @return string
        *
        */
        function safe_names($filename)
        {
            $filename = collapseWhiteSpace($filename);
            $filename = str_replace(' ', '-', $filename);
            $filename = preg_replace('/[^a-z0-9-.]/i','',$filename);
            return  strtolower($filename);
        }

        $it = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory, 0));
        /*** loop directly over the object ***/
        while($it->valid())
            {
            /*** check if value is a directory ***/
            if(!$it->isDot())
            {
                if(!is_writable($directory.'/'.$it->getSubPathName()))
                {
                    echo 'Permission Denied: '.$directory.'/'.$it->getSubPathName()."\n";
                }
                else
                {
                    /*** the old file name ***/
                    $old_file = $directory.'/'.$it->getSubPathName();

                    /*** the new file name ***/
                    $new_file = $directory.'/'.$it->getSubPath().'/'.safe_names($it->current());
                   
                    /*** rename the file ***/
                    rename ($old_file, $new_file);

                    /*** a little message to say file is converted ***/
                    echo 'Renamed '. $directory.'/'.$it->getSubPathName() ."\n";
                }
            }
            /*** move to the next iteration ***/
            $it->next();
        }
       
        /*** when we are all done let the user know ***/
        echo 'Renaming of files complete'."\n";
    }
    catch(Exception $e)
    {
        echo $e->getMessage()."\n";
    }
?>
分享到:
评论

相关推荐

    DirectoryIterator(解决方案).md

    DirectoryIterator是PHP中强大的文件遍历工具,掌握它的使用可以让文件操作更加方便和灵活。但在实际使用中,开发者需要注意理解面向对象编程的相关概念,以及熟悉PHP文件系统函数,才能发挥DirectoryIterator的最大...

    DirectoryIterator.md

    在进一步深入目录结构时,`DirectoryIterator`可以与`RecursiveDirectoryIterator`和`RecursiveIteratorIterator`类联合使用。`RecursiveDirectoryIterator`是`DirectoryIterator`的扩展,它允许递归遍历目录和子...

    php中通过DirectoryIterator删除整个目录的方法

    `DirectoryIterator`是PHP内建的一个类,用于遍历指定目录中的文件和子目录。本文将详细介绍如何使用`DirectoryIterator`来实现这一功能。 `DirectoryIterator`是PHP的 SPL(Standard PHP Library)的一部分,SPL...

    PHP简单遍历文件批量加文字水印,图片水印

    遍历文件通常采用递归方式,通过PHP的DirectoryIterator或RecursiveDirectoryIterator类来实现。这些类可以帮助我们访问指定目录下的所有文件和子目录,进而对每个文件执行相应的操作。在给定的描述中,提到了一个...

    PHP高级程序设计SPL

    1. **DirectoryIterator**: 用于遍历目录中的文件和子目录。 2. **FilesystemIterator**: 扩展了 DirectoryIterator,增加了更多的文件属性检查选项。 3. ** RecursiveDirectoryIterator**: 可以递归地遍历整个目录...

    php的spl库基本使用

    SPL提供了多种迭代器用于遍历文件系统,如`DirectoryIterator`, `FilesystemIterator`, ` RecursiveDirectoryIterator`等,它们允许开发者遍历目录、过滤文件类型,甚至递归遍历子目录。 ### 7. 面向对象设计模式 ...

    joomla迭代器的用法

    在PHP5中,引入了多个内置的迭代器类,如ArrayIterator、CachingIterator、LimitIterator、RecursiveIterator、SimpleXMLIterator和DirectoryIterator,它们极大地简化了处理XML文档、文件系统等复杂结构的工作。...

    php计算指定目录下文件占用空间的方法

    RecursiveDirectoryIterator类继承自DirectoryIterator类,它提供了getChildren()方法,这个方法返回当前目录下的所有子目录和文件。而RecursiveIteratorIterator类用于遍历迭代器的递归迭代器。 通过实例代码中的...

    解析PHP SPL标准库的用法(遍历目录,查找固定条件的文件)

    本篇文章着重介绍SPL标准库中用于遍历目录和查找固定条件文件的方法,即RecursiveDirectoryIterator类和FilterIterator类的使用。 RecursiveDirectoryIterator类提供了一种方式,可以递归遍历文件系统中的目录和子...

    php读取出一个文件夹及其子文件夹下所有文件的方法示例

    除了上述方法,还可以使用`DirectoryIterator`类从 SPL(SPL 是 PHP 的标准库,专门处理各种迭代器)进行迭代,以更面向对象的方式处理文件和目录: ```php function listAllFiles($dir) { $result = []; $...

Global site tag (gtag.js) - Google Analytics