欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

写一个函数可以遍历所有文件夹和文件

程序员文章站 2022-05-30 14:48:46
...

这是一道十分常考的面试题,考查了PHP对目录的操作,递归操作,linux的目录结构。

所使用的目录函数有:

opendir ( string $path [, resource $context ] ) : resource

如果成功则返回目录句柄的 resource,失败则返回 FALSE

如果 path 不是一个合法的目录或者因为权限限制或文件系统错误而不能打开目录,opendir() 返回 FALSE 并产生一个 E_WARNING 级别的 PHP 错误信息。可以在 opendir() 前面加上“@”符号来抑制错误信息的输出。

readdir ([ resource $dir_handle ] ) : string

成功则返回文件名 或者在失败时返回 FALSE

Warning

此函数可能返回布尔值 FALSE,但也可能返回等同于 FALSE 的非布尔值。请阅读 布尔类型章节以获取更多信息。应使用 === 运算符来测试此函数的返回值。

is_dir ( string $filename ) : bool

如果文件名存在,并且是个目录,返回 TRUE,否则返回FALSE

closedir ([ resource $dir_handle ] ) : void

闭由 dir_handle 指定的目录流。流必须之前被 opendir() 所打开。

 

该题的解题思路为:

1.打开文件句柄

2.循环读取句柄资源直到读取完毕,即readdir返回false

3.判断如果为'.'和'..'则跳过

4.如果是目录则带上完整目录名进行递归

5.是文件则将文件名写入数组中

6.关闭文件句柄

实现代码如下:

<?php

function myScandir($dir = NULL)
{
    if($dir == NULL) return ;
    $files = [];
    if(($handle = @opendir($dir)) !== false) {
        while(($file = readdir($handle)) !== false){
            if($file !== '.' && $file !== '..'){
                if(is_dir($dir.'/'.$file)) {
                    $files[$file] = myScandir($dir.'/'.$file);
                }else{
                    $files[] = $file;
                }
            }
        }
    }
    closedir($handle);
    return $files;
}
var_dump(myScandir('/tmp'));

在这里需要注意的一点是: $handle = @opendir($dir) !== false 和 ($handle = @opendir($dir) ) !== false 是不一样的,因为赋值运算符的优先级比判断运算符低,所以如果不加括号,会优先执行 @opendir($dir) !==  false,因此$handle只会是布尔值,而不是文件resource。

我看网上很多都是抄来抄去的,而且不带一点解释,只会贴代码,注意事项也不说,因此在此自己总结一番。不过逻辑都是一样的。