【问题标题】:unlink files with a case-insensitive (glob-like) pattern使用不区分大小写(类似 glob)的模式取消链接文件
【发布时间】:2012-03-29 21:17:48
【问题描述】:

我有两个文件夹,一个是视频,第二个是每个视频的配置文件(每个视频 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

没关系,它对我有很大帮助,但我有一个问题。

并非所有文件都相同,例如: Name.of.The.video.jpg Name.Of.The.Video.xml

如果我回显寻找该字符串的文件夹并且与 $filename 不同,则将返回空。 所以,我的问题是,我怎样才能使搜索不区分大小写? 谢谢。

【问题讨论】:

    标签: php directory glob


    【解决方案1】:

    strcasecmp() 是一个有效的函数吗?它是一个不区分大小写的str比较函数吗?

    当然,如果您知道文件名并且可以将其回显,您可以将其传递给 unlink()?

    【讨论】:

      【解决方案2】:

      您正在使用区分大小写的glob 函数。因此,您使用了错误的函数来获取文件列表。

      因此,您应该首先规范化目录中的文件名,使它们共享相同的大小写(例如全部小写)。或者您需要使用另一种方法来获取不区分大小写的目录列表。我建议第一个,但是如果这不是一个选项,为什么不先glob 处理所有文件,然后使用允许指定不区分大小写的模式的preg_grep 过滤文件列表?

      这让我想到将DirectoryIteratorRegexIterator 一起使用更实际:

      $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());
      }
      

      Iterators 代码灵活性的一个很好的例子是您更改的要求:同时对两个目录执行此操作。您只需创建两个DirectoryIterators 并将一个附加到另一个AppendIterator。任务完成。其余代码保持不变:

      ...
      $files = new AppendIterator();
      $files->append(new DirectoryIterator($dirPath1));
      $files->append(new DirectoryIterator($dirPath2));
      ...
      

      瞧。听起来不错? glob 适用于一些需要它的快速工作。对于其他所有具有目录操作的东西,开始考虑 SPL。它的力量更大。

      【讨论】:

      • $removeFile = scandir($dirPath); print_r(preg_grep("/$term/i",$removeFile));我会试试这个
      • @akun:我给你加了一个例子,并不是你误解了我的意思。这是关于删除文件的,所以要小心。
      • @akun:最好是DirectoryIterator
      • code $filename = 'name.of.the.video.xml'; $term = str_replace(".xml","", $filename); $dirPath = ("D:/test/"); $removeFile = scandir($dirPath); $test = (preg_grep("/$term/i",$removeFile)); foreach ($test as $value) { unlink ($dirPath.$value); }
      • @akun:最好从答案中获取迭代器示例。例如,您需要引用该术语以使正则表达式模式正常工作。此外,您还有一个 SPLFileInfo 对象,而不仅仅是一个非常有用的字符串。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-03
      • 2014-01-22
      • 2017-06-12
      • 1970-01-01
      • 2012-03-24
      相关资源
      最近更新 更多