php获取某目录下所有文件的方法scandir、readdir和RecursiveDirectoryIterator的功能异同,性能更好的是哪个呢

遍历某个目录下的所有文件是常遇到的一些问题,比如递归上传目录下面所有文件、扫描插件目录的所有文件,等等。

常用的方法有scandir、readdir和RecursiveDirectoryIterator方式,两种是有区别的,实现方式如下:


一、用scandir

function getFiles($dir){
    $files = array();
    $sub_files = scandir($dir);
    foreach ($sub_files as $file) {
        if ($file == '.' || $file == '..') {
            continue;
        }
        $path = $dir . '/' . $file;
        if (is_dir($path)) {
            $files = array_merge($files, getFiles($path));
        } else {
            $files[] = $path;
        }
    }
    return $files;
}

// 获取root目录下的所有文件
$files = getFiles('/');
print_r($files);


二、用readdir:

function getFiles($dir){
    $files = array();
    $handle = opendir($dir);

    while (false !== ($item = readdir($handle))) {
        if ($item != '.' && $item != '..') {
            $path = $dir . '/' . $item;
            if (is_file($path)) {
                $files[] = $path;
            } elseif (is_dir($path)) {
                $files = array_merge($files,getFiles($path));
            }
        }
    }

    closedir($handle);
    return $files;
}

// 获取root目录下的所有文件
$files = getFiles('/');
print_r($files);


三、用RecursiveIteratorIterator这个生成器:

function getFiles($dir){
    $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir));
    $files = array();
    foreach($iterator as $file){
        if($file->isFile()){
            $files[] = $file->getPathname();
        }
    }
    return $files;
}

// 获取root目录下的所有文件
$files = getFiles('/');
print_r($files);


结果都能获取到指定目录下的文件,区别在于scandir首先把指定目录的数据放到数组里面(一次性),然后进行遍历,这样如何数据量太大会导致内存、性能问题。而后面两种是通过多次递归读取的方式迭代获取文件,性能大大提升。

在性能方面,`readdir()` 函数通常比 `RecursiveIteratorIterator` 更高效。这是因为 `readdir()` 是一个较低级别的目录遍历函数,直接读取目录的文件项并返回,

而 `RecursiveIteratorIterator` 是一个更高级的迭代器模式,提供了更多的功能和灵活性,但相应地也增加了一些开销。

因此,在处理简单的目录结构时,使用 `readdir()` 可能会更高效。它是一种简洁而直接的方式来遍历目录并获取文件信息。

但是,对于复杂的目录结构,特别是需要进行深层遍历或需要进行过滤的情况,`RecursiveIteratorIterator` 提供了更方便和灵活的方法。

总的来说,如果性能是您的主要关注点,并且目录结构相对简单,那么使用 `readdir()` 函数可能更合适。但如果您需要更高级的遍历功能和更灵活的过滤选项,那么 `RecursiveIteratorIterator` 可能更适合您的需求,

尽管它可能稍微慢一些。在实际应用中,最好根据具体的需求和场景来选择合适的方法。


方法性能区别
RecursiveIteratorIterator中等到高

- 使用迭代器模式,提供了一个逐层遍历目录的功能

- 可以通过设置遍历模式和过滤器来自定义遍历规则。

- 代码相对简洁,易于使用。

- 适合处理大型或复杂的目录结构。

readdir()中等

- 使用传统的目录处理函数

- 需要手动编写递归逻辑,进行目录遍历。

- 返回的是目录项名称,需要进一步处理才能获取文件的绝对路径。

- 适用于简单的目录结构。

scandir()低到中等

- 返回目录中的文件和子目录的名称列表。

- 不需要手动编写递归逻辑,可以一次性获取目录中的所有文件和子目录

- 返回的是相对路径或文件名,需要进一步处理才能获取文件的绝对路径。<br>- 适用于简单的目录结构。


评论/留言