`

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";
    }
?>
分享到:
评论

相关推荐

    PHP使用DirectoryIterator显示下拉文件列表的方法

    这一知识点主要涉及PHP中的DirectoryIterator类,这是一个迭代器类,它用于读取目录中的文件和子目录。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**: 可以递归地遍历整个目录...

    DirectoryIterator.md

    DirectoryIterator.md

    php-5.2.0-win32-installer.msi

    6. SPL(Standard PHP Library):这是一个内置的PHP库,包含多种数据结构和迭代器,如ArrayIterator、DirectoryIterator等,丰富了PHP的编程能力。 三、集成Web服务器 在Win32环境下,PHP可以与IIS或Apache等Web...

    php-5.2.10.tar.gz

    - SPL(Standard PHP Library):这是PHP的标准扩展库,包含各种数据结构和迭代器,如ArrayIterator、DirectoryIterator等,5.2.10版进一步丰富了SPL的功能。 2. PHP与Discuz!的结合: Discuz!是一款基于PHP和...

    php_manual_zh_5.2 手册中文版

    4. **SPL(Standard PHP Library)**:PHP 5.2引入了标准PHP库,包含了各种有用的接口、类和迭代器,如ArrayIterator、DirectoryIterator等,帮助开发者更方便地操作数组和文件系统。 5. **SimpleXML**:这是PHP...

    28个PHP常用类

    在PHP编程中,类是构建复杂程序结构的基础,它们封装了数据和操作这些数据的方法,使得代码更加模块化和易于管理。"28个PHP常用类"可能包含了多个常见的、实用的类,这些类通常被广泛应用于各种PHP项目中,以解决...

    PHP常用类,开发中经常用到 你懂的

    在PHP编程中,类是构建复杂应用程序的基础,它允许我们定义自定义的数据类型,并封装相关的数据和功能。这里提到的“PHP常用类”通常是指在日常开发中经常使用的、能够提高代码复用性和效率的类库。这些类库涵盖了...

    php获取目录流 在线编辑模板原理

    在PHP中,我们可以使用`scandir()`函数或者`DirectoryIterator`类来获取目录流,即读取目录中的所有文件和子目录。`scandir()`函数简单易用,它返回一个包含目录中所有文件和子目录的数组。而`DirectoryIterator`则...

    PHP常用类集合

    - `DirectoryIterator`类:迭代目录中的文件。 - `FilesystemIterator`类:更通用的文件系统迭代器。 6. **HTTP请求与响应**: - `HttpRequest`类:可以用来发送HTTP请求并获取响应,例如通过cURL库实现。 - `...

    php常用的class类

    在PHP编程中,类(Class)是面向对象编程的基础,它定义了一组特性和行为,这些特性通过属性(Properties)来表示,而行为则通过方法(Methods)来实现。"php常用的class类"这个主题涵盖了PHP开发中经常使用的30个类...

    php的spl库基本使用

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

    joomla迭代器的用法

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

    PHP树型目录 目录

    1. **文件和目录操作**:首先,你需要熟悉PHP中的`scandir()`、`glob()`或`DirectoryIterator`类等函数或类,它们用于读取和遍历文件系统中的目录和文件。 2. **递归函数**:为了构建树形结构,我们需要编写一个...

Global site tag (gtag.js) - Google Analytics