// 指定目录
$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 有什么区别?
RecursiveIteratorIterator
和 scandir
都是 PHP 中用于遍历文件和目录的函数,但它们有以下区别:
scandir
函数用于遍历一个目录下的所有文件和子目录,但不会递归遍历子目录下的文件和目录,因此需要额外编写递归遍历的代码。而RecursiveIteratorIterator
是一个递归的迭代器,可以递归地遍历一个目录及其子目录下的所有文件和目录。scandir
函数会将目录下的所有文件和子目录都读取到内存中,因此如果遍历的目录下有大量文件或者文件夹,会占用较多内存,而RecursiveIteratorIterator
可以逐个文件或目录遍历,避免了大量数据读取到内存中的问题。
综上,RecursiveIteratorIterator
更加适合遍历大型文件和目录结构。