2010-09-30 42 views

回答

95
foreach (new RecursiveIteratorIterator(new RecursiveDirectoryIterator('.')) as $filename) 
{ 
    // filter out "." and ".." 
    if ($filename->isDir()) continue; 

    echo "$filename\n"; 
} 


PHP文件:

+7

SPL的+1。 IMO的时间(已经有一段时间了)开始使用SPL而不是这些巨大而缓慢的程序块。 – superultranova 2011-02-16 23:11:17

+1

美丽的解决方案 – 2012-11-01 01:28:17

+9

完整代码(更改文件夹名称) - '<?php' '$路径=真实路径( 'yourfolder/examplefolder');' '的foreach(新RecursiveIteratorIterator(新RecursiveDirectoryIterator($路径)),为$文件名)' ''{ '回声 “$文件名\ n”;' '}' '>' – 2013-03-28 10:58:32

4

我认为你正在寻找的东西php's glob function。您可以拨打glob(**)以获得递归文件列表。

编辑:我意识到我的glob不能在所有系统上可靠地工作,所以我提交了这个更接受的答案更漂亮的版本。

function rglob($pattern='*', $flags = 0, $path='') 
{ 
    $paths=glob($path.'*', GLOB_MARK|GLOB_ONLYDIR|GLOB_NOSORT); 
    $files=glob($path.$pattern, $flags); 
    foreach ($paths as $path) { $files=array_merge($files,rglob($pattern, $flags, $path)); } 
    return $files; 
} 

来自:http://www.phpfreaks.com/forums/index.php?topic=286156.0

21

所以你正在寻找一个递归目录列表?

function directoryToArray($directory, $recursive) { 
    $array_items = array(); 
    if ($handle = opendir($directory)) { 
     while (false !== ($file = readdir($handle))) { 
      if ($file != "." && $file != "..") { 
       if (is_dir($directory. "/" . $file)) { 
        if($recursive) { 
         $array_items = array_merge($array_items, directoryToArray($directory. "/" . $file, $recursive)); 
        } 
        $file = $directory . "/" . $file; 
        $array_items[] = preg_replace("/\/\//si", "/", $file); 
       } else { 
        $file = $directory . "/" . $file; 
        $array_items[] = preg_replace("/\/\//si", "/", $file); 
       } 
      } 
     } 
     closedir($handle); 
    } 
    return $array_items; 
} 
+3

不要在递归中使用正则表达式,它们往往非常慢!在你的情况下使用rtrim函数。 – machineaddict 2013-10-31 08:27:22

+2

我重写这是一个要点,要更高效,只返回文件:https://gist.github.com/brucekirkpatrick/8528710 – 2014-01-20 20:43:55

0

我需要实现一个指定目录的读取,并依托Chuck Vose的功能,我创造了这个页面读取目录依靠的JQuery:

<?php 

/** 
* Recovers folder structure and files of a certain path 
* 
* @param string $path Folder where files are located 
* @param string $pattern Filter by extension 
* @param string $flags Flags to be passed to the glob 
* @return array Folder structure 
*/ 
function getFolderTree($path) 
{ 
    //Recovers files and directories 
    $paths = glob($path . "*", GLOB_MARK | GLOB_ONLYDIR | GLOB_NOSORT); 
    $files = glob($path . "*"); 

    //Traverses the directories found 
    foreach ($paths as $key => $path) 
    { 
     //Create directory if exists 
     $directory = explode("\\", $path); 
     unset($directory[count($directory) - 1]); 
     $directories[end($directory)] = getFolderTree($path); 

     //Verify if exists files 
     foreach ($files as $file) 
     { 
      if (strpos(substr($file, 2), ".") !== false) 
       $directories[] = substr($file, (strrpos($file, "\\") + 1)); 
     } 
    } 

    //Return the directories 
    if (isset($directories)) 
    { 
     return $directories; 
    } 
    //Returns the last level of folder 
    else 
    { 
     $files2return = Array(); 
     foreach ($files as $key => $file) 
      $files2return[] = substr($file, (strrpos($file, "\\") + 1)); 
     return $files2return; 
    } 
} 

/** 
* Creates the HTML for the tree 
* 
* @param array $directory Array containing the folder structure 
* @return string HTML 
*/ 
function createTree($directory) 
{ 
    $html = "<ul>"; 
    foreach($directory as $keyDirectory => $eachDirectory) 
    { 
     if(is_array($eachDirectory)) 
     { 
      $html .= "<li class='closed'><span class='folder'>" . $keyDirectory . "</span>"; 
      $html .= createTree($eachDirectory); 
      $html .= "</li>"; 
     } 
     else 
     { 
      $html .= "<li><span class='file'>" . $eachDirectory . "</span></li>"; 
     } 
    } 
    $html .= "</ul>"; 

    return $html; 
} 

//Create output 
$directory = getFolderTree('..\videos'); 
$htmlTree = createTree($directory["videos"]); 
?> 
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 
<html xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
     <meta http-equiv="content-type" content="text/html; charset=iso-8859-1"/> 
     <title>PHP Directories</title> 

     <link rel="stylesheet" href="http://jquery.bassistance.de/treeview/jquery.treeview.css" /> 
     <link rel="stylesheet" href="http://jquery.bassistance.de/treeview/demo/screen.css" /> 

     <script src="http://jquery.bassistance.de/treeview/lib/jquery.js" type="text/javascript"></script> 
     <script src="http://jquery.bassistance.de/treeview/lib/jquery.cookie.js" type="text/javascript"></script> 
     <script src="http://jquery.bassistance.de/treeview/jquery.treeview.js" type="text/javascript"></script> 

     <script type="text/javascript" src="http://jquery.bassistance.de/treeview/demo/demo.js"></script> 

    </head> 
    <body> 
     <div id="main"> 
      <ul id="browser" class="filetree"> 
       <?php echo $htmlTree;?> 
      </ul> 
     </div> 
    </body> 
</html> 

结构中使用采用JQuery树,该网站被采取: http://jquery.bassistance.de/treeview/demo/

我希望它是有用的!

2
function files($path,&$files = array()) 
{ 
    $dir = opendir($path."/."); 
    while($item = readdir($dir)) 
     if(is_file($sub = $path."/".$item)) 
      $files[] = $item;else 
      if($item != "." and $item != "..") 
       files($sub,$files); 
    return($files); 
} 
print_r(files($_SERVER['DOCUMENT_ROOT'])); 
相关问题