写一个函数可以遍历所有文件夹和文件
这是一道十分常考的面试题,考查了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。
我看网上很多都是抄来抄去的,而且不带一点解释,只会贴代码,注意事项也不说,因此在此自己总结一番。不过逻辑都是一样的。
上一篇: 递归删除一个非空文件夹
下一篇: Node Mac 环境搭建
推荐阅读
-
PHP遍历某个目录下的所有文件和子文件夹的实现代码
-
php 遍历一个文件夹下的所有文件和子文件
-
php遍历文件夹下的所有文件和子文件夹示例
-
C# winfrom 写的一个搜索助手,可以按照标题和内容搜索,支持doc,xls,ppt,pdf,txt等格式的文件搜索
-
asp.net遍历目录文件夹和子目录所有文件
-
【操作系统作业—lab1】linux shell脚本 遍历目标文件夹和所有文件 | 包括特殊字符文件名的处理
-
php 遍历显示文件夹下所有目录、所有文件的函数,没有分页的代码
-
PHP遍历某个目录下的所有文件和子文件夹的实现代码
-
php 遍历一个文件夹下的所有文件和子文件
-
php 遍历显示文件夹下所有目录、所有文件的函数,没有分页的代码