我有两个文件夹,其中一个是视频,第二个是每个视频的配置文件(每个视频3个文件)。现在,如果我要删除视频,我必须手动删除文件。 我发现了这个:
<?php
$filename = 'name.of.the.video.xml';
$term = str_replace(".xml","", $filename);
$dirPath = ("D:/test/");
foreach (glob($dirPath.$term.".*") as $removeFile)
{
unlink ($removeFile);
}
?>
回声将返回:
d:/test/name.of.the.video.jpg
d:/test/name.of.the.video.srt
d:/test/name.of.the.video.xml
没关系,这对我很有帮助,但我在这里遇到了问题。
并非所有文件都是相同的ex: Name.of.The.video.jpg Name.Of.The.Video.xml
如果我回显查找该字符串的文件夹并且不符合$ filename将返回空。 所以,我的问题是,我怎样才能使搜索Case不敏感? 谢谢。
答案 0 :(得分:2)
您正在使用区分大小写的glob
函数。因此,您使用了错误的函数来获取文件列表。
因此,您应首先规范化目录中的文件名,以便它们共享相同的大小写(例如全小写)。或者您需要使用另一种方法来使目录列表不区分大小写。我建议第一个,但是如果这不是一个选项,为什么不首先glob
所有文件,然后使用preg_grep
过滤文件列表,这允许指定不区分大小写的模式?
这使我认为将DirectoryIterator
与RegexIterator
一起使用更为切实可行:
$filename = 'name.of.the.video.xml';
$term = basename($filename, ".xml");
$files = new DirectoryIterator($dirPath);
$filesFiltered = new RegexIterator($files, sprintf('(^%s\\..*$)i', preg_quote($term)));
foreach($filesFiltered as $file)
{
printf("delete: %s\n", $file);
unlink($file->getPathname());
}
Iterator
代码灵活性的一个很好的例子就是你改变了的要求:一次为两个目录做这个。您只需创建两个DirectoryIterator
,然后使用AppendIterator
将其附加到另一个...
$files = new AppendIterator();
$files->append(new DirectoryIterator($dirPath1));
$files->append(new DirectoryIterator($dirPath2));
...
。任务完成。其余代码保持不变:
glob
VOILÀ。听起来不错? {{1}}对于一些需要它的快速工作是可以的。对于目录操作的其他一切,开始考虑SPL。它拥有更多的力量。
答案 1 :(得分:1)
strcasecmp()是一个有效的函数吗?它是一个不区分大小写的str比较函数?
当然,如果您知道文件名并且可以将其回显,您可以将其传递给unlink()?