`

用PHP5的DirectoryIterators递归扫描目录

阅读更多

PHP5中增加了Iterator,一组有助于导航和处理等级数据结构的现成接口,这是PHP5最有趣的新特性之一。

这些Iterator显著减少了处理XML文档树或文件集合所需的代码。PHP5中使用大量Iterator,包括ArrayIterator、 CachingIterator、LimitIterator、RecursiveIterator、SimpleXMLIterator和 DirectoryIterator。

通过DirectoryIterator可以迅速有效地对目录中的文件进行处理。在编码过程中稍微增加一些创造力,DirectoryIterator还可用于递归处理嵌套式目录树。这两个任务只需使用几行代码就可以完成,比“标准”处理方法有了显著提高。

处理单级目录

首先我们从简单的任务着手:处理一个单级目录。输入(或复制)以下代码(列表A),修改目录路径以反映当地配置:

列表A

<?php

$it = new DirectoryIterator("/tmp/mystuff");

foreach($it as $file) {

if (!$it->isDot()) {

echo $file . "n";

}

}

?>

在浏览器中查看这段代码的输出结果,你会在指定目录中看到一个文件列表。这一切是如何发生的呢?DirectoryIterator提供一个预先确 定的接口来重述一个目录的内容;示例目标目录的位置后,就可以把它当作一个标准的PHP数组来处理,每个元素代表目录中的一个文件。注意它使用isDot ()方法分别过滤掉“.”和“..”目录。

处理嵌套式目录树

递归处理一个嵌套式目录树几乎同样简单。在这种情况下,DirectoryIterator需要检查它在单级目录中遇到的每一个对象,确定其是一个文件还是目录。如果是一个目录,就更深入一级检验下一级的内容。这听起来似乎相当复杂,在过去一般都需要15行以上的代码。

但是,使用PHP5,你只需要两个新的Iterator:RecursiveIterator和RecursiveIteratorIterator,它们组合了所有上述功能。见列表B:

列表B

<?php

$it = new RecursiveDirectoryIterator("/tmp");

foreach(new RecursiveIteratorIterator($it) as $file) {

echo $file . "n";

}

?>

这时,输入结果将列出起始目录下的所有文件和目录。不必说,如果需要处理某个特定目录级下的所有文件——例如,递归压缩一个目录树;或修改一系列嵌套文件的组/所有者许可时——使用这种递归内置接口就非常方便。

现实应用:打印一个目录树

打印图形目录树是目录递归的一个常见应用。利用Iterator处理这个任务十分简单,因为Iterator类文档中包含一个专门为这个应用而编写 的实例类。DirectoryTreeIterator(感谢Marcus Boerger)为前面讨论的RecursiveIteratorIterator提供了其它改进,特别是在树结构中代表深度和位置的ASCII标记。

列表C说明了DirectoryTreeIterator的用法。

列表C

<?php

$it = new DirectoryTreeIterator("/tmp/cookbook/");

foreach($it as $path) {

echo $path . "n";

}

?>

以下是你看到的一部分输出结果:

-ch01

-recipe01

-example01.php

-example02.php

-recipe02

-example01.php

-example02.php

-recipe03

-example01.php

...

 

 

为更好了解这些DirectoryIterator的价值,尝试用标准的文件和目录函数对本教程中说明的三个应用编码 

分享到:
评论

相关推荐

    JAVA递归删除目录失败

    运维兄弟一不小心在服务器上创建了无限递归的目录,拜托我帮忙解决。 so easy,写了一个递归删除目录,但结果出乎意料,一个递归目录删除成功,而另外一个却删除失败,刚开始怀疑文件被占用问题,后来被排除了。后来...

    易语言递归实现目录枚举所有子目录

    本文将深入探讨如何使用易语言实现递归目录枚举,以便遍历指定目录及其所有子目录中的文件。 目录枚举是程序设计中常见的需求,例如在文件管理、备份、搜索等方面都有应用。在易语言中,我们可以使用“文件”和...

    c#文件扫描递归方法实现

    // 使用并行任务扫描每个目录 await Task.WhenAll(directories.Select(directory =&gt; { return Task.Run(() =&gt; { RecursiveScan(directory); }); })); } ``` `ConcurrentScan`方法接受一个目录数组,为每个...

    VC6 递归得到目录下文件列表

    在编程领域,尤其是在Windows...总结,"VC6 递归得到目录下文件列表"的知识点主要包括:Windows API的使用、递归算法、文件属性检查、文件遍历及错误处理。通过掌握这些知识,开发者可以有效地管理和操作文件系统资源。

    java递归与非递归实现扫描文件夹下所有文件

    在Java中,可以使用File类来表示文件和文件夹,然后使用递归函数来实现文件夹下所有文件的扫描。 在上面的代码中,我们定义了一个FolderFileScanner类,该类中有两个静态方法:scanFilesWithRecursion和...

    c#递归扫描指定文件夹下的所有word文件,查找文件中是否包含某一字符串

    c#扫描指定文件夹下的word文件,查找文件中是否包含某一字符串,使用NPOI实现,可以递归扫描子文件夹,这是一个例子的源代码,没有用多线程,建议自己加上线程处理。使用.Net framework 4.5

    C递归遍历目录.txt

    ### C语言递归遍历目录知识点详解 #### 一、递归遍历目录的基本概念 在计算机编程中,递归遍历目录是指程序通过递归的方式遍历指定目录及其子目录下的所有文件和子目录的过程。这种方法常用于查找特定类型的文件、...

    Linux系统递归生成目录中文件的md5的方法

    linux下使用md5sum递归生成整个目录的md5 今天要用md5sum操作目录,递归生成目录下所有文件的md5值,结果发现它不支持递归操作于是写了个php脚本处理下 代码: &lt;?php $path ='/data/www/bbs/source'; $...

    递归遍历目录并生成树

    在给定的标题“递归遍历目录并生成树”中,涉及的核心技术是递归算法和Windows API的使用,特别是与文件系统交互的部分。这个任务可以通过使用MFC(Microsoft Foundation Classes)中的`CTreeCtrl`控件来实现,它...

    C# 用递归的方式查找指定文件夹下的所有子目录

    本话题主要关注如何使用递归方法遍历指定文件夹及其所有子目录。我们将探讨以下几个关键知识点: 1. **递归的基本概念**: 递归是一种函数调用自身的技术,它通过解决子问题来解决原问题。在C#中,递归函数通常...

    使用递归生成文件目录树

    ### 使用递归生成文件目录树 #### 概述 在计算机科学中,文件系统的组织结构通常采用树形结构表示,其中根目录为树的根节点,而子目录和文件则作为分支节点。为了清晰地展示文件系统中的层级关系,本篇文章将介绍...

    FTP递归扫描文件到本地代码(Java)

    // 开始扫描目录 scanDirectory(ftpClient, ENTRY_DIRECTORY); System.out.println("扫描完成"); } catch (IOException e) { e.printStackTrace(); } finally { // 断开FTP连接 try { ftpClient.logout(); ...

    php如何实现递归遍历文件目录

    在PHP中,递归遍历文件目录是一种常用的技术,它允许开发者访问并处理指定目录及其所有子目录中的文件。这在处理大量文件或构建文件管理系统时尤其有用。下面将详细介绍如何使用PHP实现这一功能。 首先,我们需要...

    linux 目录树实现代码递归

    本篇将深入探讨如何使用递归算法在C语言中实现Linux目录树的遍历。 首先,我们需要理解递归的概念。递归是一种解决问题的方法,它通过调用自身来解决子问题,直到达到基本情况。在处理目录树时,我们可以把根目录视...

    PHP递归获取目录内所有文件的实现方法

    接着,使用`scandir()`函数扫描目录,得到一个包含当前目录中所有文件和子目录(包括`.`和`..`)的数组。然后,通过`array_diff()`函数移除`.`和`..`这两个特殊目录。 接下来,函数遍历`$files`数组: ```php ...

    C语言实现文件扫描

    如果是目录,则进入该目录并递归调用 `view()` 函数;如果是文件,则输出其完整路径。此外,还提供了遍历当前目录下所有文件/目录的功能。 #### 四、注意事项 - 在实际应用中,需要确保程序能够正确处理异常情况,...

    php递归创建目录的方法

    PHP递归创建目录的方法主要涉及了PHP编程中目录处理的核心概念,以及如何利用递归思想来解决目录创建问题。在计算机科学中,递归是一种解决问题的方法,通过函数调用自身来解决子问题,最终达到解决整个问题的目的。...

    目录扫描工具dirsearch-master

    目录扫描工具Dirsearch是一款基于Python开发的强大工具,专门...5. 目录递归扫描:Dirsearch支持目录递归扫描,能够深入挖掘目标网站中的子目录,提高扫描的全面性。 6. 扫描状态显示:Dirsearch在扫描过程中会实时显示

    php递归获取子级,父级,无限极分类,带demo,效率超高

    通常,使用预排序遍历树(Preorder Traversal)或后序遍历(Postorder Traversal)可以有效减少递归深度,降低内存使用。另外,通过缓存结果,避免重复计算,也能显著提高性能。 5. **DataTree.php**: 这个文件很...

    PHP递归创建多级目录

    这意味着我们可以直接使用dirname()来优化代码,如果目标目录不存在,就递归地创建其父目录,直到根目录为止。当根目录创建成功后,再逐级向下创建目录。这种方法可以避免手动遍历目录路径,简化代码。 最后,提到...

Global site tag (gtag.js) - Google Analytics