搜索

查看: 3204|回复: 11

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

[复制链接]
发表于 2023-5-4 17:05:34 | 显示全部楼层 |阅读模式
Editor 2023-5-4 17:05:34 3204 11 看全部
目录
  • 一、使用dir()函数遍历目录
  • 二、使用opendir()、readdir()函数遍历目录
  • 三、使用glob()函数遍历目录
  • 四、使用php scandir函数遍历目录和所有文件
  • 五、测试以上四种方法的性能并分析结果       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 . '
    ';
                    mydir($path . $file . '/');
                    }else{
                    echo '文件:' . $path . $file . '
    ';
                    }
                }
            }
        $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 . '
    ';
                        myreaddir($path . $file . '/');
                    }else{
                        echo '文件:' . $path . $file . '
    ';
                    }
                }
            }
        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=’*.*’,表示扫描当前目录下的文件,不包括文件夹,返回的是一个数组。
        参数$path=’images/*’,表示扫描指定目录下所有的文件,包括文件夹,也可以扫描指定的文件类型,如:images/*.jpg;注意,如果只输入:images只会返回该文件夹名称,如果只输入:images/ 则什么也不会返回。
        参数$path=’*’,表示扫描指定目录下的所有文件、目录及子目录的文件。

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

    五、测试以上四种方法的性能并分析结果
           通过测试可以看出,在单一遍历时dir()、readdir()函数效率完败glob()函数;而递归遍历时,glob()函数性能稍微好一点,但优势不是很高。
           dir()函数 Directory 类的实例,而 Directory 类中封装的read()方法与readdir()函数功能一样,所以使用dir()和readdir函数遍历目录时,性能差别不大。
           到此这篇关于dir()、readdir()、scandir()和glob()四种遍历目录方法及性能分析的文章就介绍到这了,更多相关dir()、readdir()、scandir()和glob()区别内容请搜索知鸟论坛以前的文章或继续浏览下面的相关文章希望大家以后多多支持知鸟论坛!
  • 发表于 2023-6-28 18:59:18 | 显示全部楼层
    贺老师 2023-6-28 18:59:18 看全部
    感谢楼主的无私分享!要想知鸟论坛好 就靠你我他
    发表于 2023-6-29 14:33:34 | 显示全部楼层
    我是的十八簿 2023-6-29 14:33:34 看全部
    既然你诚信诚意的推荐了,那我就勉为其难的看看吧!知鸟论坛不走平凡路。
    发表于 2023-6-29 14:46:12 | 显示全部楼层
    123456865 2023-6-29 14:46:12 看全部
    其实我一直觉得楼主的品味不错!呵呵!知鸟论坛太棒了!
    发表于 2023-6-29 18:57:39 | 显示全部楼层
    素色流年783 2023-6-29 18:57:39 看全部
    既然你诚信诚意的推荐了,那我就勉为其难的看看吧!知鸟论坛不走平凡路。
    发表于 2023-6-30 02:42:18 | 显示全部楼层
    冀苍鸾 2023-6-30 02:42:18 看全部
    楼主,我太崇拜你了!我想我是一天也不能离开知鸟论坛
    发表于 2023-6-30 09:55:08 | 显示全部楼层
    无人岛屿颈 2023-6-30 09:55:08 看全部
    楼主发贴辛苦了,谢谢楼主分享!我觉得知鸟论坛是注册对了!
    发表于 2023-6-30 15:19:46 | 显示全部楼层
    李志敏 2023-6-30 15:19:46 看全部
    既然你诚信诚意的推荐了,那我就勉为其难的看看吧!知鸟论坛不走平凡路。
    发表于 2023-6-30 15:34:22 | 显示全部楼层
    麻辣鸡翅 2023-6-30 15:34:22 看全部
    楼主,大恩不言谢了!知鸟论坛是最棒的!
    发表于 2023-6-30 20:37:50 | 显示全部楼层
    六翼天使494 2023-6-30 20:37:50 看全部
    楼主发贴辛苦了,谢谢楼主分享!我觉得知鸟论坛是注册对了!
    • 您可能感兴趣
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则 返回列表

    RSS订阅| 小黑屋| 知鸟论坛 |网站地图
    本站资源来自互联网用户收集发布,如有侵权请邮件联系处理。 联系邮箱E-mail:zniao@foxmail.com
    快速回复 返回顶部 返回列表