PHP-递归扫描目录和删除目录

(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()关闭目录,并且确保在计算机中也退出了该目录,再进行删除的操作。

 

posted @ 2016-04-09 22:29  Mozshaw  阅读(1928)  评论(0编辑  收藏  举报