php scandir - >搜索文件/目录

时间:2010-05-18 23:17:24

标签: php

我在问之前搜索过,没有幸运..

我为自己寻找一个简单的脚本,我可以搜索文件/文件夹。在php手册中找到了这段代码片段(我想我需要这个),但它对我不起作用。

“正在寻找一种使用掩码搜索文件/目录的简单方法。这是一个功能。

默认情况下,此函数会在内存中保留scandir()结果,以避免为同一目录扫描多次。“

<?php 
function sdir( $path='.', $mask='*', $nocache=0 ){ 
    static $dir = array(); // cache result in memory 
    if ( !isset($dir[$path]) || $nocache) { 
        $dir[$path] = scandir($path); 
    } 
    foreach ($dir[$path] as $i=>$entry) { 
        if ($entry!='.' && $entry!='..' && fnmatch($mask, $entry) ) { 
            $sdir[] = $entry; 
        } 
    } 
    return ($sdir); 
} 
?>

感谢您的帮助,

彼得

4 个答案:

答案 0 :(得分:3)

$a = new RegexIterator(
    new RecursiveIteratorIterator(
        new RecursiveDirectoryIterator('DIRECTORY HERE')
    ),
    '/REGEX HERE/',
    RegexIterator::MATCH
);

foreach ($a as $v) {
    echo "$v\n"; //$v will be the filename
}

答案 1 :(得分:1)

答案 2 :(得分:0)

我只想搜索文件,您可以使用此代码段:

    <?php   
    $s = $get['s'];
    $e = ".htm";
    $folders = array("data1", "data2", "data3");
    $files = array(); // nothing needed here. anything in this array will be showed as a search result.
    for($i=0;$i<=count($folders)-1;$i++) {
        $glob = glob($folders[$i]);
        $files = array_merge($files, $glob[$i]);
    }
    echo "Search - $s<br><br>";
    if(count($files) == 1) {
        echo "<li><a href='$files[0]'>".heir($files[0])."</a></li>";
    }
    if(count($files) != 1) {
        for($i=0;$i<=count($files)-1;$i++) {
            echo "<li><a href='$files[$i]'>".heir($files[$i])."</a></li>";  
        }
    }
    if(count($files) == 0) {
        echo "Sorry, no hits.";
    }
?>

答案 3 :(得分:0)

接受的答案非常好,但它让我想到了岩石上的Spl迭代器。 Fabien Potencier解释了他如何在symfony中创建Finder类:

http://fabien.potencier.org/article/43/find-your-files

我也使用他的finder类,他们有一个非常漂亮的链接界面。

示例:

use Symfony\Component\Finder\Finder;

$finder = new Finder();
$finder->files()->in(__DIR__);

foreach ($finder as $file) {
   print $file->getRealpath()."\n";
}

以及..

$finder->files()->name('*.php');
// or 
$finder->files()->size('>= 1K')->size('<= 2K');
$finder->date('since yesterday');

文档:http://symfony.com/doc/2.0/cookbook/tools/finder.html

来自sf1.4框架的PHP5.2 +版本: http://svn.symfony-project.com/branches/1.4/lib/util/sfFinder.class.php

这个版本略有不同,而且不那么花哨,但也能完成这项工作。你需要创建一个sfException类,它是它与symfony框架的唯一搭配。您可以创建自己的sfException类:

class sfException extends Exception { }

可以在此处找到文档:http://www.symfony-project.org/cookbook/1_2/en/finder