我有一个服务器文件夹,其中包含大量文件,并使用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;
}
答案 0 :(得分:0)
我不能发表评论,尽管这可以回答您的问题:否。从目前的当前状态来看,您似乎必须使用这种逻辑。 -但是-您可以创建逻辑以获取具有大写字母的文件,并在文件夹中使用copy($filename,strtolower($filename))
使其小写,然后删除具有大写字母的旧文件名。 。将来,在将更多文件添加到众多文件时,strtolower($new_file_name)
会在将文件添加到系统之前。我同意您的观点,但是这种逻辑似乎确实很慢,尤其是对于成千上万个文件。
这与您说不能重命名/转换文件名是矛盾的,尽管一旦完成,那将是唯一一次必须重命名它们的
。