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=’*.*’,表示扫描当前目录下的文件,不包括文件夹,返回的是一个数组。
参数$path=’images/*’,表示扫描指定目录下所有的文件,包括文件夹,也可以扫描指定的文件类型,如:images/*.jpg;注意,如果只输入:images只会返回该文件夹名称,如果只输入:images/ 则什么也不会返回。
参数$path=’*’,表示扫描指定目录下的所有文件、目录及子目录的文件。
四、使用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函数遍历目录时,性能差别不大。


猜你喜欢
- js中用import导入模块和用require导入模块的区别JavaScript中,模块是一种可重用的代码块,它将一些代码打包成一个单独的单
- 本地虚拟环境开发完成之后,上线过程中需要一一安装依赖包,做个记录如下:CentOS 安装python3.5.3wget https://ww
- 用户不想输入账号密码,一键登录 <label for="" @click="LoginDL&q
- 说明当我们需要用脚本实现,远程登录或者远程操作的时候,都要去解决如何自动输入密码的问题,一般来说有3种实现方式:1).配置公钥私钥2).使用
- 【摘要】用定值 Cookie 实现反爬 Cookie 生成由于本案例需要用到一个特定的 Cookie ,所以我们需要提前将其生成,你可以直接
- 目录简介实现原理源码运行结果简介大家都知道在微信朋友圈或者微博以及QQ动态中,有很多“强迫症患者”发图片都爱发9张,而有些图是一张图片分成的
- 遍历并修改图像像素值在使用opencv处理图像时,有时需要对图像的每个像素点进行处理,比如取反、修改值等操作,就需要通过h和w遍历像素。依然
- 实际上face_recognition这个项目尤其是dlib更适用于Linux系统。经过我的测试,在性能方面,编译同样规格的项目,这个工具在
- 本文介绍了Python格式化输出%s和%d的实例案例。分享给大家供大家参考,具体如下:python print格式化输出1. 打印字符串pr
- 本文实例讲述了RSA实现JS前端加密与PHP后端解密功能。分享给大家供大家参考,具体如下:web前端,用户注册与登录,不能直接以明文形式提交
- golang拾遗主要是用来记录一些遗忘了的、平时从没注意过的golang相关知识。很久没更新了,我们先以一个谜题开头练练手:package
- 使用if…elif…elif…else 实现switch/case可以使用if…elif…elif..else序列来代替switch/cas
- 在登陆PLSQL Developer时报ora-12513错误,需要修改本地数据库的监听配置文件,其过程相对简单。在Oracle安装目录中搜
- 一、技术路线requests:网页请求BeautifulSoup:解析html网页re:正则表达式,提取html网页信息os:保存文件imp
- 如果看到特别感兴趣的抖音vlogger的视频,想全部dump下来,如何操作呢?下面介绍介绍如何使用python导出特定用户所有视频信息抓包分
- 双向链表一种更复杂的链表是“双向链表”或“双面链表”。每个节
- python3 sorted取消了对cmp的支持。python3 帮助文档:sorted(iterable,key=None,reverse
- 1. 警告不是异常你是不是经常在使用一些系统库或者第三方模块的时候,会出现一些既不是异常也不是错误的警告信息?这些警告信息,有时候非常多,对
- 出自:【孟宪会之精彩世界】 发布日期:2005年1月27日 8点48分0秒 [有删改] 由于某些原
- Go语言内置int转string至少有3种方式:fmt.Sprintf("%d",n)strconv.Itoa(n)st