[英]Recursive File Search (PHP)
我正在尝试使用递归搜索返回指定目录中的文件。 我成功地实现了这一点,但是我想添加几行代码,允许我指定我想要返回的某些扩展。
例如仅返回目录中的 .jpg 文件。
这是我的代码,
<?php
$it = new RecursiveDirectoryIterator("L:\folder\folder\folder");
foreach(new RecursiveIteratorIterator($it) as $file) {
echo $file . "<br/> \n";
}
?>
请让我知道我可以在上面的代码中添加什么来实现这一点,谢谢
<?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";
}
?>
您应该创建一个过滤器:
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)
...
试试这个,它使用一组允许的文件类型,并且只在文件扩展名存在于数组中时才回显文件。
<?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
类,并且只返回匹配的文件。
让 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);
关于投票最高的答案:我创建了这段代码,它使用了更少的函数,只有 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 />";
}
}
这些都不适合我的情况。 所以我写了这个功能,不确定效率,我只是想快速删除一些重复的照片。 希望它可以帮助别人。
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');
唯一可以做的微小改进是,当前要使其正常工作,您必须在开始目录上添加一个尾随正斜杠。
在此示例代码中;
$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";
}
这是在文件夹和子文件夹中搜索的正确方法
$it = new RecursiveDirectoryIterator(__DIR__);
$findExts = Array ( 'jpeg', 'jpg' );
foreach(new RecursiveIteratorIterator($it) as $file)
{
$ext = pathinfo($file, PATHINFO_EXTENSION);
if(in_array($ext, $findExts)){
echo $file.PHP_EOL;
}
}
您可能想查看有关使用 glob() 进行类似搜索的页面:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.