2010-09-30 21 views

risposta

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

    echo "$filename\n"; 
} 


PHP:

+7

+1 per SPL. IMO il suo tempo (è stato per un po ') per iniziare a utilizzare SPL invece di questi enormi blocchi procedurali lenti. – superultranova

+1

Bella soluzione –

+9

Codice completo (cambia nome cartella) - ' ' –

4

Penso che stai cercando php's glob function. È possibile chiamare glob(**) per ottenere un elenco di file ricorsivo.

EDIT: Ho realizzato che il mio glob non funziona in modo affidabile su tutti i sistemi, quindi invio questa versione molto più carina della risposta accettata.

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

da: documentazione http://www.phpfreaks.com/forums/index.php?topic=286156.0

21

Quindi stai cercando un elenco di directory ricorsivo?

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

Non usare regex in ricorsione, tendono ad essere molto lenti! Nel tuo caso usa la funzione rtrim. – machineaddict

+2

Ho riscritto questo come un esempio per essere più efficiente e restituire solo i file: https://gist.github.com/brucekirkpatrick/8528710 –

0

avevo bisogno per implementare la lettura di una determinata directory, e basandosi sulla funzione di Chuck Vose, ho creato questa pagina per leggere le directory basandosi su 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> 

la struttura utilizzata nel albero con JQuery, il sito è stato preso: http://jquery.bassistance.de/treeview/demo/

Spero che sia utile!

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'])); 
Problemi correlati