简体   繁体   English

PHP递归目录路径

[英]PHP recursive directory path

i have this function to return the full directory tree : 我有这个函数来返回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

} }

but what i want to do is to search for a file/folder and return it's path, how can i do that? 但我想要做的是搜索文件/文件夹并返回它的路径,我该怎么做? do you have such a function or can you give me some tips on how to do this? 你有这样的功能还是可以给我一些如何做到的提示?

Try to use RecursiveIteratorIterator in combination with RecursiveDirectoryIterator 尝试将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();
    }
}

Additional reading: 补充阅读:

do you have such a function or can you give me some tips on how to do this? 你有这样的功能还是可以给我一些如何做到的提示?

Yes I do. 是的,我愿意。

I actually asked a similar question earlier this morning, but I figure it out. 我今天早上早些时候问了一个类似的问题,但我弄清楚了。 The problem I was having is that the file names . 我遇到的问题是文件名。 and .. are returned by readdir() and they cause problems when attempting to opendir() with them. 和readdir()返回它们,并且在尝试使用它们时会导致问题。 When I filtered these out, my recursion worked perfectly. 当我过滤掉这些时,我的递归工作完美。 You might want to modify the format in which it outputs the directories that fit the search. 您可能希望修改输出适合搜索的目录的格式。 Or modify it to output all files and directories. 或者修改它以输出所有文件和目录。 Find an image for "go.jpg" and try it out. 查找“go.jpg”的图像并试一试。

I can't find my post to notify that I found the solution. 我找不到我的帖子来通知我找到了解决方案。

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;
    }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM