dir()、readdir()、scandir()和glob()四种遍历目录方法及性能分析

时间:2023-05-25 11:18:27 

       php遍历目录和文件的场景在很多时候都能用到,遍历目录方法的方法有好几种,那么应该使用哪种方法呢?一般情况下,遍历目录时只需遍历出目录和文件,如果要遍历子目录下目录和文件,就需要用到is_dir()判断是否问目录,若是目录则递归遍历。php中遍历目录用到的函数有dir()、readdir()、scandir()和glob(),那么四个函数有什么区别呢?性能又如何呢?

一、使用dir()函数遍历目录

    dir()函数是以对象的方式访问目录,如果成功,返回一个 Directory 类实例,参数错误的情况下返回 NULL , 其它错误情况返回 false。
    代码

function mydir($path){
   $dir = dir($path);
   while(false !== ($file = $dir -> read())){
       if($file != '.' && $file != '..'){
           if(is_dir($path . $file)){
               echo '目录:' . $path . $file . '<br/>';
               mydir($path . $file . '/');
               }else{
               echo '文件:' . $path . $file . '<br/>';
               }
           }
       }
   $dir -> close();
   }

二、使用opendir()、readdir()函数遍历目录

    相关函数
        函数opendir()用于打开指定目录,接受一个目录的路径及目录名作为参数,函数返回值为可供其他目录函数使用的目录句柄(资源类型)。如果该目录不存在或者没有访问权限,则返回FALSE。
        函数readdir()用于读取指定目录,接受已经用opendir()函数打开的可操作目录句柄作为参数,函数返回当前目录指针位置的一个文件名,并将目录指针向后移动一位。当指针位于目录的结尾时,因为没有文件存在则返回FALSE。
        函数closedir()关闭指定目录,接受已经用opendir()函数打开的可操作目录句柄作为参数。函数无返回值,运行后关闭打开的目录。
        函数rewinddir()倒回目录句柄,接受已经用opendir()函数打开的可操作目录句柄作为参数。将目录指针重置目录到开始处,即倒回目录的开头。

function myreaddir($path){
   $handle = opendir($path);
   if($handle){
       while (false !== ($file = readdir($handle))) {
           if($file != '.' && $file != '..'){
               if(is_dir($path.$file)){
                   echo '目录:' . $path . $file . '<br/>';
                   myreaddir($path . $file . '/');
               }else{
                   echo '文件:' . $path . $file . '<br/>';
               }
           }
       }
   closedir($handle);
   return false;
   }
}

三、使用glob()函数遍历目录

    glob() 函数返回匹配指定模式的文件名或目录,该函数返回一个包含有匹配文件 / 目录的数组,如果出错返回 false。
    代码

function myglob($path){
   foreach(glob($path) as $file){
       if($file != '.' && $file != '..'){
           if(is_dir($file)){
               echo '目录:' . $file . '/';
               myglob($file . '/*');
           }else{
               echo '文件:' . $file . '';
           }
       }
   }
}

其中参数$path 有三种情况:

    参数$path=&rsquo;*.*&rsquo;,表示扫描当前目录下的文件,不包括文件夹,返回的是一个数组。
    参数$path=&rsquo;images/*&rsquo;,表示扫描指定目录下所有的文件,包括文件夹,也可以扫描指定的文件类型,如:images/*.jpg;注意,如果只输入:images只会返回该文件夹名称,如果只输入:images/ 则什么也不会返回。

    参数$path=&rsquo;*&rsquo;,表示扫描指定目录下的所有文件、目录及子目录的文件。

四、使用php scandir函数遍历目录和所有文件

<?php
$dir = "."; //当前目录
list_file($dir);
function list_file($dir){
   $list = scandir($dir); // 得到该文件下的所有文件和文件夹
   foreach($list as $file){//遍历
       $file_location=$dir."/".$file;//生成路径
       if(is_dir($file_location) && $file!="." &&$file!=".."){ //判断是不是文件夹
           echo "------------------------sign in $file_location------------------";
           list_file($file_location); //继续遍历
       }
       echo "<br/>";
   }
}
?>

五、测试以上四种方法的性能并分析结果

<?php
set_time_limit(0);
for($i = 1; $i <= 5; $i++){
   $starttime = microtime(true);
   mydir('./');
   //scandir('./');
   //myreaddir('./');
   //myglob('*');
   $endtime = microtime(true);
   $total = ($endtime - $starttime) * 1000;
   echo "第 $i 次,用时 $total 毫秒;";
}
?>

       通过测试可以看出,在单一遍历时dir()、readdir()函数效率完败glob()函数;而递归遍历时,glob()函数性能稍微好一点,但优势不是很高。

       dir()函数 Directory 类的实例,而 Directory 类中封装的read()方法与readdir()函数功能一样,所以使用dir()和readdir函数遍历目录时,性能差别不大。

标签:dir(),readdir(),scandir(),glob()
0
投稿

猜你喜欢

  • 关于javascript中伪数组和真数组的一些小秘密

    2023-07-02 03:47:47
  • MySQL优化之数据表的处理

    2008-12-22 14:45:00
  • python后端接收前端回传的文件方法

    2023-07-29 04:04:05
  • Go语言快速入门指针Map使用示例教程

    2024-05-05 09:34:11
  • SQL Server Reporting Services 匿名登录的问题及解决方案

    2024-01-20 04:24:05
  • Python类的动态绑定实现原理

    2022-05-02 00:52:03
  • 浅谈python中scipy.misc.logsumexp函数的运用场景

    2023-11-10 17:10:56
  • 一个修改Oracle数据库用户密码的小诀窍

    2009-09-30 15:29:00
  • 数据结构简明备忘录 线性表

    2024-01-25 01:59:28
  • python爬取网页内容转换为PDF文件

    2023-04-29 10:53:12
  • Python获取DLL和EXE文件版本号的方法

    2023-09-07 11:43:23
  • canvas学习之API整理笔记(一)

    2024-04-10 10:54:24
  • python 使用socket传输图片视频等文件的实现方式

    2022-11-12 11:55:37
  • PyQt5按下按键选择文件夹并显示的实现

    2023-05-02 02:02:10
  • python贪吃蛇核心功能实现上

    2021-12-06 15:49:18
  • PHP composer更新指定依赖包过程详细讲解

    2023-05-27 18:05:34
  • layer页面跳转,获取html子节点元素的值方法

    2024-04-29 13:43:15
  • Python新手们容易犯的几个错误总结

    2021-06-22 12:19:54
  • 关于Oracle listener日志解析利器的使用方法

    2024-01-13 21:36:59
  • 使用MySQL实现select into临时表的功能

    2024-01-25 01:14:53
  • asp之家 网络编程 m.aspxhome.com