簡體   English   中英

"遞歸文件搜索 (PHP)"

[英]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() 進行類似搜索的頁面:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM