使用dir()、readdir()和glob()遍历目录及测试性能

       一般情况下,遍历目录时只需遍历出子目录和文件,不需要遍历出子目录下的目录和文件,如果要遍历子目录下目录和文件,就需要用到is_dir()判断是否问目录,若是目录则递归遍历。php中遍历目录用到的函数有dir()、readdir()、glob(),那么三个函数有什么区别呢?性能又如何呢?

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

  1. dir()函数是以对象的方式访问目录,如果成功,返回一个 Directory 类实例,参数错误的情况下返回 NULL , 其它错误情况返回 false。
  2. 代码
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()函数遍历目录

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

  1. glob() 函数返回匹配指定模式的文件名或目录,该函数返回一个包含有匹配文件 / 目录的数组,如果出错返回 false。
  2. 代码
function myglob($path){
    foreach(glob($path) as $file){
        if($file != '.' && $file != '..'){
            if(is_dir($file)){
                echo '目录:' . $file . '/<br/>';
                myglob($file . '/*');
            }else{
                echo '文件:' . $file . '<br/>';
                }
            }
        }
    }

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

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

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

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

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

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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 你可以使用 PHP 的 opendir()、readdir() 和 closedir() 函数遍历目录路径。下面是一个示例代码: ```php <?php $dir = "/path/to/directory"; // 打开目录 if (is_dir($dir)){ if ($dh = opendir($dir)){ // 遍历目录中的文件和子目录 while (($file = readdir($dh)) !== false){ // 忽略 . 和 .. 目录 if($file != "." && $file != ".."){ echo "filename: " . $file . "<br>"; } } // 关闭目录 closedir($dh); } } ?> ``` 在上面的示例中,$dir 是要遍历目录路径。首先,使用 is_dir() 函数检查该路径是不是一个目录。如果是目录,则使用 opendir() 函数打开该目录,并使用 readdir() 函数遍历目录中的文件和子目录。在遍历过程中,忽略 . 和 .. 目录。最后,使用 closedir() 函数关闭目录。 ### 回答2: 在PHP中,可以使用`scandir`函数遍历目录路径。`scandir`函数可以返回指定路径下的所有文件和子目录的名称。 下面是使用`scandir`函数遍历目录路径的示例代码: ``` <?php $path = "目录路径"; // 替换为你要遍历目录路径 // 使用scandir函数获取指定路径下的所有文件和子目录的名称 $files = scandir($path); // 遍历得到的文件和子目录的名称 foreach ($files as $file) { // 排除当前目录(.)和上级目录(..) if ($file == '.' || $file == '..') { continue; } // 根据文件或目录的名称进行相应的操作 $filePath = $path . '/' . $file; if (is_dir($filePath)) { // 如果是目录,可以进行递归遍历或其他操作 echo "目录:$file\n"; } else { // 如果是文件,可以进行相应的操作 echo "文件:$file\n"; } } ?> ``` 在上述代码中,首先通过`scandir`函数获取指定路径下的所有文件和子目录的名称。然后使用`foreach`循环遍历得到的文件和子目录的名称。使用`is_dir`函数判断是文件还是目录,并进行相应的操作。 需要注意的是,在遍历之前排除了当前目录(.)和上级目录(..),因为它们在任何目录中都是固定的。 运行以上代码,你可以替换`目录路径`为你要遍历目录路径,然后执行该代码,就可以输出该目录下的所有文件和子目录的名称。 ### 回答3: 在PHP中,可以使用`opendir()`函数打开一个目录,然后使用`readdir()`函数读取目录中的内容,实现遍历目录的功能。 首先,我们使用`opendir()`函数打开目录,将目录的路径作为参数传入,得到一个目录的句柄,如下所示: ```php $dir = opendir('path/to/directory'); ``` 接下来,我们可以使用`readdir()`函数读取目录中的内容。`readdir()`函数会依次读取目录中的文件和子目录,直到读取完所有内容或者出现错误。每次读取一个内容,可以通过循环来遍历目录中的所有内容,如下所示: ```php while (($file = readdir($dir)) !== false) { // 对每个文件和子目录进行处理 echo $file."<br>"; } ``` 在循环体内,我们可以对每个文件或子目录进行处理,例如打印文件名或执行其他操作。在上面的示例中,我们使用`echo`语句打印每个文件或子目录的名称。 最后,遍历结束后,我们需要关闭目录句柄,以释放资源: ```php closedir($dir); ``` 综上所述,以上代码片段演示了如何使用PHP遍历目录路径。我们首先使用`opendir()`函数打开目录,然后使用`readdir()`函数读取目录中的内容,并对每个文件和子目录进行处理。最后,我们使用`closedir()`函数关闭目录句柄。这样,我们就可以在PHP中实现目录遍历的功能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值