php 文件遍历

作者admin

6月 28, 2023

 // 指定目录

$dir = “/path/to/your/directory”;

// 遍历目录及其子目录

$objects = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($dir));

foreach ($objects as $name => $object) {

if ($object->isFile() && preg_match(‘/\.(jpg|jpeg|png|gif)$/i’, $object->getPathname())) {

// 只处理图片文件

try {

$objectName = str_replace($dir, , $name);

// 获取文件名(不包含目录路径)

$ossClient->uploadFile($bucket, $objectName, $object->getPathname());

// 上传文件到OSS

echo “Upload file $name to OSS successfully\n”;

} catch (OssException $e) {

echo “Error uploading file $name to OSS: “ . $e->getMessage() . “\n”;

}

}

}

RecursiveDirectoryIterator

是 PHP 自带的一个类,用于迭代遍历一个目录下的所有文件和子目录。其主要用于遍历目录并获取目录中的所有文件和子目录。

下面是 RecursiveDirectoryIterator 的具体参数及用法:

构造函数参数

  • $path:要迭代遍历的目录路径
  • $flags:一个掩码,指定一些额外的参数,比如是否迭代隐藏文件、是否返回子目录等。

常用方法

  • getChildren():获取当前文件夹的子文件夹和文件迭代器
  • getSubPath():获取当前文件夹相对于迭代开始文件夹的相对路径
  • getSubPathname():获取当前文件夹相对于迭代开始文件夹的相对路径,并加上当前文件夹名

$iterator = new RecursiveDirectoryIterator(‘/path/to/directory’);
$filesCount = 0;
foreach (new RecursiveIteratorIterator($iterator) as $file) {
if ($file->isFile()) {
$filesCount++;
}
}
echo ‘Total files: ‘ . $filesCount;

以上示例遍历了 /path/to/directory 目录下的所有文件,统计了文件总数并输出。

RecursiveIteratorIterator

是PHP中的一个迭代器类,可以用于遍历多层嵌套的数据结构(如多层嵌套的目录和子目录)。

以下是RecursiveIteratorIterator的常用参数和用法:

参数:

  • $iterator:要迭代的可递归对象
  • $mode:迭代器模式,有4种取值:SELF_FIRST(默认值,先返回父级,再返回子级)、CHILD_FIRST(先返回子级,再返回父级)、LEAVES_ONLY(只返回叶节点)和ONLY_FIRST_LEVEL(只返回第一级)。
  • $flags:迭代器的行为选项。可选取值有CATCH_GET_CHILD(忽略访问子目录时可能抛出的异常)、CATCH_GET_CHILD_EXCEPTION(忽略访问子目录时可能抛出的异常,但会记录异常日志)、SKIP_DOTS(跳过”.”和”..”目录)和KEY_AS_FILENAME(迭代器返回的键值是文件路径而非文件名)。

示例:

// 实例化RecursiveDirectoryIterator类
$dir = new RecursiveDirectoryIterator(‘/path/to/dir’);

// 实例化RecursiveIteratorIterator类
$iterator = new RecursiveIteratorIterator($dir, RecursiveIteratorIterator::SELF_FIRST);

// 遍历目录下的所有文件和子目录
foreach ($iterator as $file) {
// 对遍历到的文件和目录进行处理
}

在 PHP 5.1.0 及以上版本都可以使用,没有特别的限制。

但是要注意,如果要遍历的目录太大,可能会导致内存溢出,需要设置合适的内存限制和执行时间限制来避免这种情况的发生。可以使用 ini_set() 函数来设置这些限制,例如:

ini_set(‘memory_limit’, ‘256M’);
ini_set(‘max_execution_time’, 300);

scandir()

用于获取指定目录下的所有文件和子目录。

它的基本语法如下:

scandir ( string $directory , int $sorting_order = SCANDIR_SORT_ASCENDING , resource|null $context = null ) : array|false

  • $directory:要获取文件和子目录的目录路径。
  • $sorting_order:可选参数,指定文件和子目录的排序方式。默认值为SCANDIR_SORT_ASCENDING,可以设置为SCANDIR_SORT_DESCENDING,表示降序排序。
  • $context:可选参数,指定目录句柄的上下文。如果不需要使用,可以不填写。

该函数返回一个包含目录下所有文件和子目录的数组,如果出现错误则返回false

示例:

$dir = ‘/path/to/dir’;
$files = scandir($dir);

foreach ($files as $file) {
echo $file . “\n”;
}

输出:

.

..

file1.txt

file2.txt

subdir

函数返回的数组包含当前目录'.'和上级目录'..',所以需要在遍历时进行判断过滤。

glob()

用于返回匹配指定模式的文件路径名列表。

它的基本语法如下:

glob ( string $pattern [, int $flags = 0 ] ) : array|false

  • $pattern:必需,用于匹配的模式,可以包含通配符。
  • $flags:可选,标志,可以是下列值的任意组合:
    • GLOB_MARK – 在每个返回的文件名后附加一个斜杠。
    • GLOB_NOSORT – 返回的文件名不进行排序。
    • GLOB_NOCHECK – 如果没有指定的匹配则返回用于搜索的模式。
    • GLOB_NOESCAPE – 反斜杠不转义元字符。
    • GLOB_BRACE – 展开花括号中的子模式。
    • GLOB_ONLYDIR – 仅返回与模式匹配的目录名。
    • GLOB_ERR – 如果在搜索期间发生错误,则 glob() 返回 FALSE,而不是仅仅停止搜索。

返回值:一个包含符合模式的文件/目录路径的数组,或者在出错时返回 FALSE

示例:

// 搜索所有的 jpg 图片
$files = glob(‘/path/to/folder/*.jpg’);

// 搜索所有的图片,包括子目录中的
$files = glob(‘/path/to/folder/**/*.{jpg,jpeg,png,gif}’, GLOB_BRACE);

注意:使用 glob() 函数时,如果匹配到的文件数量很多,可能会导致内存消耗较大,需要注意。

RecursiveIteratorIterator与scandir 有什么区别?

RecursiveIteratorIteratorscandir 都是 PHP 中用于遍历文件和目录的函数,但它们有以下区别:

  1. scandir 函数用于遍历一个目录下的所有文件和子目录,但不会递归遍历子目录下的文件和目录,因此需要额外编写递归遍历的代码。而 RecursiveIteratorIterator 是一个递归的迭代器,可以递归地遍历一个目录及其子目录下的所有文件和目录。
  2. scandir 函数会将目录下的所有文件和子目录都读取到内存中,因此如果遍历的目录下有大量文件或者文件夹,会占用较多内存,而 RecursiveIteratorIterator 可以逐个文件或目录遍历,避免了大量数据读取到内存中的问题。

综上,RecursiveIteratorIterator 更加适合遍历大型文件和目录结构。

作者 admin

百度广告效果展示