PHP Case不敏感版本的file_exists()

Kir*_*met 17 php file-io file

我正在尝试考虑在PHP中实现不区分大小写的file_exists函数的最快方法.我最好的方法是枚举目录中的文件,然后执行strtolower()到strtolower()比较,直到找到匹配项?

Kir*_*met 25

我使用了注释中的源来创建这个函数.如果找到则返回完整路径文件,否则返回FALSE.

对文件名中的目录名不起作用.

function fileExists($fileName, $caseSensitive = true) {

    if(file_exists($fileName)) {
        return $fileName;
    }
    if($caseSensitive) return false;

    // Handle case insensitive requests            
    $directoryName = dirname($fileName);
    $fileArray = glob($directoryName . '/*', GLOB_NOSORT);
    $fileNameLowerCase = strtolower($fileName);
    foreach($fileArray as $file) {
        if(strtolower($file) == $fileNameLowerCase) {
            return $file;
        }
    }
    return false;
}
Run Code Online (Sandbox Code Playgroud)

  • 如果文件不存在,你会返回什么?O_O (4认同)
  • 总是返回一个完整的文件名不是很好吗?当找到匹配时,有时会得到一个布尔值,有时候是一个有用的路径,这有点奇怪. (3认同)
  • 我认为`fileExists`函数应该返回`true`,如果文件存在的话:) (2认同)

Abr*_*ver 9

这个问题已有几年历史,但是它与多个重复项相关联,因此这是一种简单的方法。

返回false如果$filename在任何情况下没有在找到$path返回的第一个文件或实际文件名glob(),如果它是在任何情况下发现:

$result = current(preg_grep("/".preg_quote($filename)."/i", glob("$path/*")));
Run Code Online (Sandbox Code Playgroud)
  • 获取路径中的所有文件 glob
  • $filename无论如何,Grep 都不i区分大小写
  • current 返回数组的第一个文件名

删除current()以返回所有匹配的文件。这在区分大小写的文件系统上很重要,因为IMAGE.jpg并且image.JPG可以同时存在。