2010-09-30 42 views
42

thể trùng lặp:
Get the hierarchy of a directory with PHP
Getting the names of all files in a directory with PHPdanh sách PHP tất cả các file trong thư mục

Tôi đã thấy chức năng để danh sách tất cả các tập tin trong một thư mục nhưng làm thế nào tôi có thể liệt kê tất cả các các tệp trong thư mục con quá, vì vậy, trả về một mảng như thế nào?

$files = files("foldername"); 

Vì vậy $fileslà một cái gì đó tương tự như

array("file.jpg", "blah.word", "name.fileext") 

Trả lời

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

    echo "$filename\n"; 
} 


PHP:

+7

+1 cho SPL. IMO thời gian của nó (đã được một lúc) để bắt đầu sử dụng SPL thay vì các khối thủ tục rất lớn, chậm này. – superultranova

+1

Giải pháp tuyệt đẹp –

+9

Mã đầy đủ (thay đổi tên người dùng) - ' ' –

4

Tôi nghĩ rằng bạn đang tìm kiếm php's glob function. Bạn có thể gọi glob(**) để nhận danh sách tệp đệ quy.

EDIT: Tôi nhận ra rằng glob của tôi không hoạt động đáng tin cậy trên tất cả các hệ thống vì vậy tôi gửi phiên bản này đẹp hơn nhiều của câu trả lời được chấp nhận.

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

từ: tài liệu http://www.phpfreaks.com/forums/index.php?topic=286156.0

21

Vì vậy, bạn đang tìm kiếm một danh sách thư mục đệ quy?

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

Không sử dụng regexes trong đệ quy, chúng có xu hướng rất chậm! Trong trường hợp của bạn, hãy sử dụng hàm rtrim. – machineaddict

+2

Tôi viết lại điều này như một ý chính để có hiệu quả hơn và chỉ trả lại các tệp: https://gist.github.com/brucekirkpatrick/8528710 –

0

tôi cần thiết để thực hiện việc đọc của một thư mục nào đó, và dựa vào các chức năng của Chuck Vose, tôi tạo ra trang này để đọc các thư mục dựa vào 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> 

Cấu trúc được sử dụng trong cây với JQuery, trang web đã được chụp: http://jquery.bassistance.de/treeview/demo/

Tôi hy vọng nó hữu ích!

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'])); 
Các vấn đề liên quan