You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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;

问题原因

  1. 逻辑冗余且遗漏:RecursiveIteratorIterator本身会遍历所有文件和子目录,但你只在目录中用glob找CSV,会漏掉当前根目录下的CSV文件,同时重复处理目录。
  2. 特殊字符路径:路径里的Las Piñas包含特殊字符ñ,可能导致文件系统函数无法正确解析路径。
  3. 未跳过系统目录:默认会遍历.和..目录,可能干扰路径拼接。

修正后的解决方案

方案一:用迭代器直接筛选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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 21:20:32