PHP - 在多个目录中搜索文件

时间:2016-02-26 15:32:28

标签: php file search directory dir

我想制作脚本来搜索多个目录中的一个文件,例如我有dir的结构:

 -images
   --2014
   --2015
   --2016

现在我的PHP脚本应该在2014/2015/2016之一搜索FILE.jpg(文件夹将动态创建,因此我无法在脚本中放置文件夹列表(只是文件夹'图像&#39) ;将永远)。

祝你好运!

2 个答案:

答案 0 :(得分:0)

您只能使用glob() 在您描述的确切情况下,它应如下所示:

$files = glob('path_to_images/*/FILE.jpg');

更一般地说,在已知文件夹路径和搜索文件名之间根据需要放置尽可能多的/*以探索给定的深度级别。

根据OP的评论

编辑,扩展解决方案

如果您对树结构一无所知,可以进行深层次的多层次搜索,如下所示:

function doGlob($target, $context) {
  if ($dirs = glob($context . '/*', GLOB_ONLYDIR)) {
    foreach ($dirs as $dir) {
      $result = array_merge($result, doGlob($target, $dir));
    }
  }
  return $result;
}
$files = doGlob('FILE.jpg', 'path_to_images');

它会在给定的$target中的任何位置返回所有$context个文件。

警告:如果context是一个很大的结构,可能会耗费大量时间!

所以你可能会限制搜索深度,如下所示:

function doGlob($target, $context, $max_depth = -1, $depth = 0) {
  $result = glob($context . '/' . $target);
  if ($depth > $max_depth) {
    return $result;
  }
  if ($dirs = glob($context . '/*', GLOB_ONLYDIR)) {
    foreach ($dirs as $dir) {
      $result = array_merge($result, doGlob($target, $dir, $max_depth, $depth + 1));
    }
  }
  return $result;
}
$files = doGlob('FILE.jpg', 'path_to_images', <max-depth>);

另一方面,如果您打算只检索一个唯一的文件,您可能会在找到后立即停止:

function doGlob($target, $context) {
  if ($result) {
    return $result;
  }
  if ($dirs = glob($context . '/*', GLOB_ONLYDIR)) {
    foreach ($dirs as $dir) {
      $result = array_merge($result, doGlob($target, $dir));
    }
  }
  return $result;
}
$files = doGlob('FILE.jpg', 'path_to_images');

答案 1 :(得分:0)

您也可以使用scandir:

function search($d)
{
    $dir=scandir($d);
    echo '<ul>';
    foreach ($dir as $key => $value) 
    {
        if($value!='.' && $value!='..')
        {
            if(is_dir($d.'/'.$value))
            {
                echo "<li>".$value."</li>";
                search($d.'/'.$value);
            }

            else
                echo "<li>".$value."</li>";

        }
    }

    echo '</ul>';
}

search('images');

在此示例中,我显示所有文件,但您可以添加条件:

function search($d, $search)
{
    $dir=scandir($d);
    echo '<ul>';
    foreach ($dir as $key => $value) 
    {
        if($value!='.' && $value!='..')
        {
            if(is_dir($d.'/'.$value))
            {
                echo "<li>".$value."</li>";
                search($d.'/'.$value, $search);
            }

            else
            {
                echo "<li>".$value."</li>";
                if($value==$search)
                    echo "found";

            }

        }
    }

    echo '</ul>';
}

search('images', 'your_file');