(1) 通过递归扫描目录并打印
// php递归扫描目录 function scanMyDir($path){ // 打开目录 $dh = opendir($path); echo ‘<ul>‘; // 循环读取目录 while(($file = readdir($dh)) !== false){ // 先要过滤掉当前目录‘.‘和上一级目录‘..‘ if($file == ‘.‘ || $file == ‘..‘) continue; // 为了能够显示中文目录/文件,需要进行转码 echo ‘<li>‘.iconv(‘gbk‘,‘utf-8‘,$file).‘</li>‘; // 如果该文件仍然是一个目录,进入递归 if(is_dir($path.‘/‘.$file)){ scanMyDir($path.‘/‘.$file); } } echo ‘</ul>‘; } $path = ‘e:/Music‘; scanMyDir($path);
需要注意的地方:
①在读取目录的时候,会读取.和..,分别表示当前目录和上一级目录,需要过滤掉它们以进行后续的打印和操作。
②中文操作系统默认的编码是gbk,因此目录与文件的编码为gbk。想要在网页上显示的时候没有乱码,需要通过iconv函数进行转码。
③这一份代码是用无序列表来显示目录结构的。还有一种办法:可以添加一个递归深度$deep作为函数的参数,默认为0,每一次递归加1。这样不同的层级就拥有了不同的递归深度,通过str_repeat()函数来利用递归深度,就能让目录结构分出层次了。
(2) 通过递归删除目录及目录下的文件
// php递归删除目录和文件 function delAll($path){ // 打开目录 $dh = opendir($path); // 循环读取目录 while(($file = readdir($dh)) !== false){ // 过滤掉当前目录‘.‘和上一级目录‘..‘ if($file == ‘.‘ || $file == ‘..‘) continue; // 如果该文件是一个目录,则进入递归 if(is_dir($path.‘/‘.$file)){ delAll($path.‘/‘.$file); } else { // 如果不是一个目录,则将其删除 unlink($path.‘/‘.$file); } } // 退出循环后(此时已经删除所有了文件),关闭目录并删除 closedir($dh); rmdir($path); } $path = ‘./test‘; delAll($path);
需要注意的一点是:只有当这个目录不是工作状态的时候,才能进行删除。所以必须要先通过closedir()关闭目录,并且确保在计算机中也退出了该目录,再进行删除的操作。
时间: 2024-11-04 19:07:25