PHP:在目录中查找文件并获取其扩展名
高效获取指定前缀的文件扩展名
嘿,这个需求我刚好有几个实用的高效方案,比你说的遍历scandir()返回的全目录列表要省心太多!下面就给你拆解具体实现:
方案一:用glob()精准匹配(首推)
glob()可以直接在系统层面根据文件名模式过滤文件,比先拿全目录再手动过滤效率高很多,毕竟系统级的文件匹配操作比PHP层面的遍历要底层高效。
具体步骤:
- 构造匹配模式:比如前缀是
john,就用../dir/john.*来匹配所有以john开头的文件 - 获取匹配结果后手动排序(保证遇到多后缀时选字母序靠前的)
- 提取第一个文件的扩展名
代码示例:
$prefix = 'john'; $dir = '../dir'; // 处理目录路径末尾的斜杠,避免拼接出无效路径 $pattern = rtrim($dir, '/') . "/{$prefix}.*"; // GLOB_NOSORT让系统不自动排序,我们手动排序更可控 $matches = glob($pattern, GLOB_NOSORT); if (!empty($matches)) { // 按字母顺序排序,确保前缀相同的文件选排序靠前的(比如PDF会比txt先被选中) sort($matches); $targetFile = $matches[0]; // 提取文件扩展名 $extension = pathinfo($targetFile, PATHINFO_EXTENSION); echo "对应的扩展名是:{$extension}"; } else { echo "没有找到前缀为{$prefix}的文件"; }
方案二:用DirectoryIterator(大目录场景更友好)
如果你的目录里文件特别多,glob()可能会一次性把所有匹配文件加载到内存里,这时候DirectoryIterator就更合适——它是迭代器模式,逐个读取文件,内存占用极低。
代码示例:
$prefix = 'john'; $dir = '../dir'; $matchingFiles = []; $iterator = new DirectoryIterator($dir); foreach ($iterator as $fileinfo) { // 跳过目录、隐藏文件等非目标项 if (!$fileinfo->isFile() || $fileinfo->isDot()) continue; // 获取不带扩展名的文件名前缀 $filePrefix = $fileinfo->getBasename('.'.$fileinfo->getExtension()); if ($filePrefix === $prefix) { $matchingFiles[] = $fileinfo->getFilename(); } } if (!empty($matchingFiles)) { sort($matchingFiles); $extension = pathinfo($matchingFiles[0], PATHINFO_EXTENSION); echo "对应的扩展名是:{$extension}"; } else { echo "没有找到前缀为{$prefix}的文件"; }
为什么这两个方案比scandir()高效?
glob()直接借助系统文件系统的匹配能力,省去了PHP层面遍历全目录的开销DirectoryIterator按需读取文件,不会像scandir()那样一次性把整个目录的文件名都加载到数组里,内存占用差很多
另外,虽然你说“每个文件名仅对应一个文件”,但我们保留了排序逻辑,就算出现意外的同名不同后缀情况,也能自动按字母序选你要的那个,容错性拉满~
内容的提问来源于stack exchange,提问作者Dwarf Vader
相关产品推荐
相关产品推荐

