PHP中RecursiveDirectoryIterator与glob()无法读取含ñ路径下的CSV文件
问题:无法读取指定路径及其子文件夹下的CSV文件
我需要读取路径c:\Customers\NCR\Las Piñas及其子文件夹下的所有CSV文件,尝试用递归迭代器结合glob()写了代码,但没能成功读取到文件,代码如下:
$iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($path)); $html = ""; foreach ($iterator as $folder) { if ($folder->isDir()) { $all_files = glob($folder->getRealpath() . "/*.csv"); foreach ($all_files as $filename) { $html .= $filename . PHP_EOL; } } } echo $html;
问题原因
- 逻辑冗余且遗漏:
RecursiveIteratorIterator本身会遍历所有文件和子目录,但你只在目录中用glob找CSV,会漏掉当前根目录下的CSV文件,同时重复处理目录。 - 特殊字符路径:路径里的
Las Piñas包含特殊字符ñ,可能导致文件系统函数无法正确解析路径。 - 未跳过系统目录:默认会遍历
.和..目录,可能干扰路径拼接。
修正后的解决方案
方案一:用迭代器直接筛选CSV文件
$path = 'c:\Customers\NCR\Las Piñas'; // 跳过.和..目录,统一用UNIX路径格式避免Windows转义问题 $dirIterator = new RecursiveDirectoryIterator( $path, RecursiveDirectoryIterator::SKIP_DOTS | RecursiveDirectoryIterator::UNIX_PATHS ); $iterator = new RecursiveIteratorIterator($dirIterator); // 用正则筛选后缀为csv的文件(忽略大小写) $csvFilter = new RegexIterator($iterator, '/\.csv$/i', RegexIterator::MATCH); $html = ''; foreach ($csvFilter as $file) { $html .= $file->getRealPath() . PHP_EOL; } echo $html;
方案二:修复原代码逻辑
$path = 'c:\Customers\NCR\Las Piñas'; // 跳过.和..目录,避免无效遍历 $iterator = new RecursiveIteratorIterator( new RecursiveDirectoryIterator($path, RecursiveDirectoryIterator::SKIP_DOTS) ); $html = ""; foreach ($iterator as $item) { // 直接判断是否是CSV文件 if ($item->isFile() && strtolower($item->getExtension()) === 'csv') { $html .= $item->getRealpath() . PHP_EOL; } } echo $html;
额外注意事项
- 确认PHP进程对目标目录有读取权限,Windows下检查文件夹安全设置是否允许相关用户访问。
- 路径含特殊字符时,在代码开头添加
mb_internal_encoding('UTF-8');,确保编码统一,避免路径解析失败。
内容的提问来源于stack exchange,提问作者butching
相关产品推荐
相关产品推荐

