不区分大小写的file_exists用于较大的文件列表

时间:2018-08-31 00:35:35

标签: php file search

我有一个服务器文件夹,其中包含大量文件,并使用guid值随机命名(示例文件:c3c1a48e-a798-41bd-bd70-66ffdc619963.jpg)。

我需要对该文件夹进行不区分大小写的搜索,因为可能存在相同文件名的大写(或大小写混合)版本。 (我无法将现有文件转换为所有小写文件名。)

这个问题的答案 PHP Case Insensitive Version of file_exists()提供了一个功能(如下所示),该功能会将整个文件夹“ glob”到数组中,然后进行foreach搜索数组中的每个项目。

这似乎有点慢/低效,尤其是在搜索包含许多(数千)文件的文件夹时。

是否存在更有效的方式来进行不区分大小写的文件名搜索?还是使用foreach循环(如下面的代码所示)“足够有效”?

(这是上述问题推荐的代码)

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;

}

1 个答案:

答案 0 :(得分:0)

我不能发表评论,尽管这可以回答您的问题:否。从目前的当前状态来看,您似乎必须使用这种逻辑。 -但是-您可以创建逻辑以获取具有大写字母的文件,并在文件夹中使用copy($filename,strtolower($filename))使其小写,然后删除具有大写字母的旧文件名。 。将来,在将更多文件添加到众多文件时,strtolower($new_file_name)会在将文件添加到系统之前。我同意您的观点,但是这种逻辑似乎确实很慢,尤其是对于成千上万个文件。

这与您说不能重命名/转换文件名是矛盾的,尽管一旦完成,那将是唯一一次必须重命名它们的