PHP递归目录路径

时间:2010-03-07 21:57:18

标签: php path directory recursion

我有这个函数来返回full directory tree

function getDirectory( $path = '.', $level = 0 ){

$ignore = array( 'cgi-bin', '.', '..' );
// Directories to ignore when listing output. Many hosts
// will deny PHP access to the cgi-bin.

$dh = @opendir( $path );
// Open the directory to the handle $dh

while( false !== ( $file = readdir( $dh ) ) ){
// Loop through the directory

    if( !in_array( $file, $ignore ) ){
    // Check that this file is not to be ignored

        $spaces = str_repeat( ' ', ( $level * 4 ) );
        // Just to add spacing to the list, to better
        // show the directory tree.

        if( is_dir( "$path/$file" ) ){
        // Its a directory, so we need to keep reading down...

            echo "<strong>$spaces $file</strong><br />";
            getDirectory( "$path/$file", ($level+1) );
            // Re-call this same function but on a new directory.
            // this is what makes function recursive.

        } else {

            echo "$spaces $file<br />";
            // Just print out the filename

        }

    }

}

closedir( $dh );
// Close the directory handle

}

但我想要做的是搜索文件/文件夹并返回它的路径,我该怎么做?你有这样的功能,或者你可以给我一些如何做到的提示吗?

2 个答案:

答案 0 :(得分:20)

尝试将RecursiveIteratorIteratorRecursiveDirectoryIterator

结合使用
$path = realpath('/path/you/want/to/search/in');

$objects = new RecursiveIteratorIterator(
               new RecursiveDirectoryIterator($path), 
               RecursiveIteratorIterator::SELF_FIRST);

foreach($objects as $name => $object){
    if($object->getFilename() === 'work.txt') {
        echo $object->getPathname();
    }
}

补充阅读:

答案 1 :(得分:0)

  你有这样的功能吗?或者你可以给我一些如何做的提示   此?

是的我。

我今天早上早些时候问了一个类似的问题,但我弄清楚了。我遇到的问题是文件名。和readdir()返回它们,并且在尝试使用它们时会导致问题。当我过滤掉这些时,我的递归工作完美。您可能希望修改输出适合搜索的目录的格式。或者修改它以输出所有文件和目录。查找“go.jpg”的图像并试一试。

我找不到我的帖子来通知我找到了解决方案。

define ('HOME', $_SERVER['DOCUMENT_ROOT']); 

   function searchalldirectories($directory, $seachterm, $maxrecursions, $maxopendir){
        $dircontent= '';
        $dirs= array();
        if ($maxopendir > 0){
            $maxopendir--;
            $handle= opendir( HOME.'/'.$directory);
            while (( $dirlisting= readdir($handle)) !== false){
                $dn= ''; $fn= '&nbsp;&nbsp;File';
                if ( is_dir( HOME.'/'.$directory.'/'.$dirlisting) && $maxrecursions>0 && strpos( $dirlisting, '.')!==0){
                    $dirs[ count($dirs)]= $directory.'/'.$dirlisting;
                    $dn= '/'; $fn= 'Dir';
                }                           
                if ( stripos($dirlisting, $seachterm) !== false){
                    $dircontent.= '<input type="image" src="go.jpg" name="cmd" value="home:/'.$directory.'/'.$dirlisting.'"> '.$fn.':// <b>'.$directory.'/'.$dirlisting.$dn.'/</b><br>';
                }
            }
            closedir( $handle);
            for ( $i=0; $i<count( $dirs); $i++){
                $dircontent.= searchalldirectories( $dirs[$i], $seachterm, ($maxrecursions-1), $maxopendir);
            }
        }
        return $dircontent;
    }