遍历某个目录下的所有文件是常遇到的一些问题,比如递归上传目录下面所有文件、扫描插件目录的所有文件,等等。
常用的方法有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>- 适用于简单的目录结构。 |