【问题标题】:Recursive File Search (PHP)递归文件搜索 (PHP)
【发布时间】:2010-12-24 01:00:12
【问题描述】:

我正在尝试使用递归搜索返回指定目录中的文件。 我成功实现了这一点,但是我想添加几行代码,以便我指定我想要返回的某些扩展。

例如只返回目录中的 .jpg 文件。

这是我的代码,

<?php
$it = new RecursiveDirectoryIterator("L:\folder\folder\folder");
foreach(new RecursiveIteratorIterator($it) as $file) {
echo $file . "<br/> \n";
}
?>

请告诉我我可以在上面的代码中添加什么来实现这一点,谢谢

【问题讨论】:

    标签: php file-search


    【解决方案1】:
    <?php
    $it = new RecursiveDirectoryIterator("L:\folder\folder\folder");
    $display = Array ( 'jpeg', 'jpg' );
    foreach(new RecursiveIteratorIterator($it) as $file)
    {
        if (in_array(strtolower(array_pop(explode('.', $file))), $display))
            echo $file . "<br/> \n";
    }
    ?>
    

    【讨论】:

    • 只有变量应该通过引用传递
    【解决方案2】:

    你应该创建一个过滤器:

    class JpegOnlyFilter extends RecursiveFilterIterator
    {
        public function __construct($iterator)
        {
            parent::__construct($iterator);
        }
    
        public function accept()
        {
            return $this->current()->isFile() && preg_match("/\.jpe?g$/ui", $this->getFilename());
        }
    
        public function __toString()
        {
            return $this->current()->getFilename();
        }
    }
    
    $it = new RecursiveDirectoryIterator("L:\folder\folder\folder");
    $it = new JpegOnlyFilter($it);
    $it = new RecursiveIteratorIterator($it);
    
    foreach ($it as $file)
        ...
    

    【讨论】:

    • 这将不起作用,如果您在找到目录时停止(如果 ->isFile())迭代器不会深入该目录以扫描更多文件和目录,比一个更复杂-行如果。
    【解决方案3】:

    试试这个,它使用一个允许的文件类型数组,并且只有当文件扩展名存在于数组中时才会回显文件。

    <?php
    $it = new RecursiveDirectoryIterator("L:\folder\folder\folder");
    $allowed=array("pdf","txt");
    foreach(new RecursiveIteratorIterator($it) as $file) {
        if(in_array(substr($file, strrpos($file, '.') + 1),$allowed)) {
            echo $file . "<br/> \n";
        }
    }
    ?>
    

    您可能还会发现,您可以将一组允许的文件类型传递给您的 RecursiveDirectoryIterator 类,并且只返回匹配的文件。

    【讨论】:

      【解决方案4】:

      让 PHP 完成这项工作:

      $directory = new RecursiveDirectoryIterator('path/to/directory/');
      $iterator  = new RecursiveIteratorIterator($directory);
      $regex     = new RegexIterator($iterator, '/\.jpe?g$/i', RecursiveRegexIterator::GET_MATCH);
      
      echo '<pre>';
      print_r($regex);
      

      【讨论】:

      【解决方案5】:

      关于投票最多的答案:我创建的代码使用较少的函数,只有 3 个、isset()array_flip()explode(),而不是 4 个函数。我测试了投票最高的答案,它比我的慢。我建议试一试:

      $it = new RecursiveDirectoryIterator("L:\folder\folder\folder");
      foreach(new RecursiveIteratorIterator($it) as $file) {
          $FILE = array_flip(explode('.', $file));
          if (isset($FILE['php']) || isset($FILE['jpg'])) {
              echo  $file. "<br />";
          }
      }
      

      【讨论】:

      • 这在php.png 这样的情况下会中断。它不是phpjpg 文件;它是一个名为phppng 文件。验证时准确提取文件扩展名很重要。如果没有达到预期的效果,执行速度是没有意义的。
      【解决方案6】:

      这些都不适用于我的情况。所以我写了这个功能,不确定效率,我只是想快速删除一些重复的照片。希望对其他人有所帮助。

      function rglob($dir, $pattern, $matches=array())
      {
          $dir_list = glob($dir . '*/');
          $pattern_match = glob($dir . $pattern);
      
          $matches = array_merge($matches, $pattern_match);
      
          foreach($dir_list as $directory)
          {
              $matches = rglob($directory, $pattern, $matches);
          }
      
          return $matches;
      }
      
      $matches = rglob("C:/Bridge/", '*(2).ARW');
      

      唯一可以做的一点改进是,目前要让它工作,你必须在开始目录上有一个尾部正斜杠。

      【讨论】:

        【解决方案7】:

        在这个示例代码中;

        • 您可以为$directory 变量设置任何路径,例如./'L:\folder\folder\folder' 或任何其他...
        • 你也可以在$pattern中设置一个模式文件名可选,你可以为每个带有.jpg扩展名的文件加上'/\.jpg$/',如果你想找到所有文件,可以使用'//'这个变量。
        $directory = 'L:\folder\folder\folder';
        $pattern = '/\.jpg$/'; //use "//" for all files
        $directoryIterator = new RecursiveDirectoryIterator($directory);
        $iteratorIterator = new RecursiveIteratorIterator($directoryIterator);
        $regexIterator = new RegexIterator($iteratorIterator, $pattern);
        foreach ($regexIterator as $file) {
            if (is_dir($file)) continue;
            echo "$file\n";
        }
        

        【讨论】:

          【解决方案8】:

          您可能想查看有关使用 glob() 进行类似搜索的页面:

          http://www.electrictoolbox.com/php-glob-find-files/

          【讨论】:

          • 您的来源很好,但请尝试通过示例给出建设性的答案,如何将资源用于特定情况,仅添加链接作为参考。
          • 我认为 glob 也不处理递归,这是问题的一部分。
          猜你喜欢
          • 1970-01-01
          • 2012-06-15
          • 2013-06-17
          • 2012-09-16
          • 1970-01-01
          • 2020-02-24
          • 2014-12-09
          • 2021-01-25
          相关资源
          最近更新 更多