2011-08-19 69 views
45

Vui lòng cho tôi giải pháp liệt kê tất cả các thư mục, thư mục con, tệp trong thư mục bằng cách sử dụng php. Cấu trúc thư mục của tôi giống như sau:Liệt kê tất cả thư mục con và tệp trong thư mục bằng cách sử dụng php

Main Dir 
Dir1 
    SubDir1 
    File1 
    File2 
    SubDir2 
    File3 
    File4 
Dir2 
    SubDir3 
    File5 
    File6 
    SubDir4 
    File7 
    File8 

Tôi muốn nhận danh sách tất cả các tệp trong mỗi thư mục.

Có lệnh shell script nào trong php không?

Trả lời

120
function listFolderFiles($dir){ 
    $ffs = scandir($dir); 

    unset($ffs[array_search('.', $ffs, true)]); 
    unset($ffs[array_search('..', $ffs, true)]); 

    // prevent empty ordered elements 
    if (count($ffs) < 1) 
     return; 

    echo '<ol>'; 
    foreach($ffs as $ff){ 
     echo '<li>'.$ff; 
     if(is_dir($dir.'/'.$ff)) listFolderFiles($dir.'/'.$ff); 
     echo '</li>'; 
    } 
    echo '</ol>'; 
} 

listFolderFiles('Main Dir'); 
+1

Cảm ơn Shef nó đang hoạt động tốt Có phải lệnh shell của chúng để thực hiện điều này không? – Warrior

+2

'php file_name.php'? – Shef

+1

Không yêu cầu bạn là bất kỳ tập lệnh shell đơn nào để liệt kê tất cả các thư mục và tệp như esec (tìm) – Warrior

0

Bạn cũng có thể thử điều này:

<?php 
function listdirs($dir) { 
    static $alldirs = array(); 
    $dirs = glob($dir . '/*', GLOB_ONLYDIR); 
    if (count($dirs) > 0) { 
     foreach ($dirs as $d) $alldirs[] = $d; 
    } 
    foreach ($dirs as $dir) listdirs($dir); 
    return $alldirs; 
} 

$directory_list = listdirs('xampp'); 
print_r($directory_list); 
?> 
0
define ('PATH', $_SERVER['DOCUMENT_ROOT'] . dirname($_SERVER['PHP_SELF'])); 
$dir = new DirectoryIterator(PATH); 
echo '<ul>'; 
foreach ($dir as $fileinfo) 
{ 
    if (!$fileinfo->isDot()) { 
     echo '<li><a href="'.$fileinfo->getFilename().'" target="_blank">'.$fileinfo->getFilename().'</a></li>'; 

     echo '</li>'; 
    } 
} 
echo '</ul>'; 
10

Mã này liệt kê tất cả các thư mục và tập tin trong thứ tự sắp xếp trong một hình cây. Đó là trình tạo bản đồ trang web có siêu liên kết đến tất cả các tài nguyên của trang web. Nguồn trang web đầy đủ ở đây. Bạn sẽ cần phải thay đổi đường dẫn trên dòng thứ chín từ cuối.

<?php 
$pathLen = 0; 

function prePad($level) 
{ 
    $ss = ""; 

    for ($ii = 0; $ii < $level; $ii++) 
    { 
    $ss = $ss . "|&nbsp;&nbsp;"; 
    } 

    return $ss; 
} 

function myScanDir($dir, $level, $rootLen) 
{ 
    global $pathLen; 

    if ($handle = opendir($dir)) { 

    $allFiles = array(); 

    while (false !== ($entry = readdir($handle))) { 
     if ($entry != "." && $entry != "..") { 
     if (is_dir($dir . "/" . $entry)) 
     { 
      $allFiles[] = "D: " . $dir . "/" . $entry; 
     } 
     else 
     { 
      $allFiles[] = "F: " . $dir . "/" . $entry; 
     } 
     } 
    } 
    closedir($handle); 

    natsort($allFiles); 

    foreach($allFiles as $value) 
    { 
     $displayName = substr($value, $rootLen + 4); 
     $fileName = substr($value, 3); 
     $linkName = str_replace(" ", "%20", substr($value, $pathLen + 3)); 
     if (is_dir($fileName)) { 
     echo prePad($level) . $linkName . "<br>\n"; 
     myScanDir($fileName, $level + 1, strlen($fileName)); 
     } else { 
     echo prePad($level) . "<a href=\"" . $linkName . "\" style=\"text-decoration:none;\">" . $displayName . "</a><br>\n"; 
     } 
    } 
    } 
} 

?><!DOCTYPE HTML> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title>Site Map</title> 
</head> 

<body> 
<h1>Site Map</h1> 
<p style="font-family:'Courier New', Courier, monospace; font-size:small;"> 
<?php 
    $root = '/home/someuser/www/website.com/public'; 

    $pathLen = strlen($root); 

    myScanDir($root, 0, strlen($root)); ?> 
</p> 
</body> 

</html> 
+1

Tôi yêu giải pháp của bạn. –

+0

Giải pháp tuyệt vời, nó sẽ dễ dàng để làm cho nó đẹp hơn một chút? – Kilisi

9

Trong trường hợp bạn muốn sử dụng directoryIterator

Tiếp theo chức năng là một tái thực hiện @Shef câu trả lời với directoryIterator

function listFolderFiles($dir) 
{ 
    echo '<ol>'; 
    foreach (new DirectoryIterator($dir) as $fileInfo) { 
     if (!$fileInfo->isDot()) { 
      echo '<li>' . $fileInfo->getFilename(); 
      if ($fileInfo->isDir()) { 
       listFolderFiles($fileInfo->getPathname()); 
      } 
      echo '</li>'; 
     } 
    } 
    echo '</ol>'; 
} 
listFolderFiles('Main Dir'); 
7

Một cách rất đơn giản để hiển thị cấu trúc thư mục tận dụng RecursiveTreeIterator class (PHP 5> = 5.3.0, PHP 7) và tạo ra một cây đồ họa ASCII.

$it = new RecursiveTreeIterator(new RecursiveDirectoryIterator("/path/to/dir", RecursiveDirectoryIterator::SKIP_DOTS)); 
foreach($it as $path) { 
    echo $path."<br>"; 
} 

http://php.net/manual/en/class.recursivetreeiterator.php

Ngoài ra còn có một số quyền kiểm soát các đại diện ASCII của cây bằng cách thay đổi các tiền tố sử dụng RecursiveTreeIterator::setPrefixPart, ví dụ $it->setPrefixPart(RecursiveTreeIterator::PREFIX_LEFT, "|");

+0

Chính xác những gì tôi cần, tôi đổi thành $ dir, RecursiveDirectoryIterator :: SKIP_DOTS | FilesystemIterator :: UNIX_PATHS) để lấy dấu gạch chéo.Nhưng không thể tìm cách tránh | | | | - không có str_replace –

+0

@ Reign.85 Tôi cũng không quản lý để tránh những nhân vật này. Tôi không chắc chắn một cách được cung cấp bởi lớp ... –

0

muộn để chương trình, nhưng để xây dựng tắt của accepted answer ...

Nếu bạn muốn có tất cả các tệp và thư mục dưới dạng mảng (có thể được thiết kế đẹp mắt với JSON.stringify trong javascript), bạn c một thay đổi chức năng để:

function listFolderFiles($dir) { 
    $arr = array(); 
    $ffs = scandir($dir); 

    foreach($ffs as $ff) { 
     if($ff != '.' && $ff != '..') { 
      $arr[$ff] = array(); 
      if(is_dir($dir.'/'.$ff)) { 
       $arr[$ff] = listFolderFiles($dir.'/'.$ff); 
      } 
     } 
    } 

    return $arr; 
} 

cho người mới ...

Để sử dụng nói trên JSON.stringify, JS của bạn/jQuery sẽ là một cái gì đó như:

var ajax = $.ajax({ 
    method: 'POST', 
    data: {list_dirs: true} 
}).done(function(msg) { 
    $('pre').html(
     'FILE LAYOUT<br/>' + 
      JSON.stringify(JSON.parse(msg), null, 4) 
    ); 
}); 

^Đây là giả sử bạn có một phần tử <pre> trong HTML của bạn ở đâu đó. Bất kỳ hương vị của AJAX sẽ làm, nhưng tôi con số hầu hết mọi người đang sử dụng một cái gì đó tương tự như jQuery ở trên.

Và PHP kèm theo:

if(isset($_POST['list_dirs'])) { 
    echo json_encode(listFolderFiles($rootPath)); 
    exit(); 
} 

nơi bạn đã có listFolderFiles từ trước.

Trong trường hợp của tôi, tôi đã thiết của tôi $rootPath vào thư mục gốc của trang web ...

$rootPath; 
if(!isset($rootPath)) { 
    $rootPath = $_SERVER['DOCUMENT_ROOT']; 
} 

Kết quả cuối cùng là một cái gì đó giống như ...

| some_file_1487.smthng [] 
| some_file_8752.smthng [] 
| CSS  
| | some_file_3615.smthng [] 
| | some_file_8151.smthng [] 
| | some_file_7571.smthng [] 
| | some_file_5641.smthng [] 
| | some_file_7305.smthng [] 
| | some_file_9527.smthng [] 
|  
| IMAGES  
| | some_file_4515.smthng [] 
| | some_file_1335.smthng [] 
| | some_file_1819.smthng [] 
| | some_file_9188.smthng [] 
| | some_file_4760.smthng [] 
| | some_file_7347.smthng [] 
|  
| JSScripts  
| | some_file_6449.smthng [] 
| | some_file_7864.smthng [] 
| | some_file_3899.smthng [] 
| | google-code-prettify  
| | | some_file_2090.smthng [] 
| | | some_file_5169.smthng [] 
| | | some_file_3426.smthng [] 
| | | some_file_8208.smthng [] 
| | | some_file_7581.smthng [] 
| | | some_file_4618.smthng [] 
| |  
| | some_file_3883.smthng [] 
| | some_file_3713.smthng [] 

... and so on... 

Lưu ý: Bạn sẽ không nhìn chính xác như thế này - Tôi đã sửa đổi JSON.stringify để hiển thị các tab (ống dọc), căn chỉnh tất cả các giá trị được khóa, xóa trích dẫn khỏi khóa và một vài thứ khác. Tôi sẽ sửa đổi câu trả lời này bằng một liên kết nếu tôi có thể tải lên hoặc nhận đủ sự quan tâm.

1

Nó sẽ sử dụng để thực hiện thanh menu ở định dạng thư mục

$pathLen = 0; 

function prePad($level) 
{ 
    $ss = ""; 

    for ($ii = 0; $ii < $level; $ii++) 
    { 
     $ss = $ss . "|&nbsp;&nbsp;"; 
    } 

    return $ss; 
    } 

    function myScanDir($dir, $level, $rootLen) 
    { 
    global $pathLen; 

    if ($handle = opendir($dir)) { 

     $allFiles = array(); 

     while (false !== ($entry = readdir($handle))) { 
     if ($entry != "." && $entry != "..") { 
      if (is_dir($dir . "/" . $entry)) 
      { 
      $allFiles[] = "D: " . $dir . "/" . $entry; 
      } 
      else 
      { 
      $allFiles[] = "F: " . $dir . "/" . $entry; 
      } 
     } 
     } 
     closedir($handle); 

     natsort($allFiles); 

     foreach($allFiles as $value) 
     { 
     $displayName = substr($value, $rootLen + 4); 
     $fileName = substr($value, 3); 
     $linkName = str_replace(" ", " ", substr($value, $pathLen + 3)); 


     if (is_dir($fileName)) 
     { 
       echo "<li ><a class='dropdown'><span>" . $displayName . "     </span></a><ul>"; 

      myScanDir($fileName, $level + 1, strlen($fileName)); 
      echo "</ul></li>"; 
    } 
     else { 
     $newstring = substr($displayName, -3); 
     if($newstring == "PDF" || $newstring == "pdf") 

      echo "<li ><a href=\"" . $linkName . "\" style=\"text-decoration:none;\">" . $displayName . "</a></li>"; 

     } 
    $t; 
     if($level != 0) 
     { 
      if($level < $t) 
      { 
     $r = int($t) - int($level); 
     for($i=0;$i<$r;$i++) 
     { 
      echo "</ul></li>"; 
     } 
      } 
     } 
       $t = $level; 
     } 
      } 

     } 
     ?> 

             <li style="color: #ffffff"> 

               <?php             
    // ListFolder('D:\PDF'); 
    $root = 'D:\PDF'; 
    $pathLen = strlen($root); 

    myScanDir($root, 0, strlen($root)); 
    ?> 


             </li> 
0
function GetDir($dir) { 
if(is_dir($dir)) { 
    if($kami= opendir($dir)){ 
     while($file = readdir($kami)){ 
      if($file != '.' && $file != '..'){ 
       if(is_dir($dir . $file)){ 
        echo $dir . $file; 
        // since it is a directory we recurse it. 
        GetDir($dir . $file . '/'); 
       }else{ 
        echo $dir . $file; 
       } 
      } 
     } 
    } 
    closedir($kami);   
    } 

}

0

Nếu bạn đang tìm kiếm một thư mục đệ quy giải pháp liệt kê và sắp xếp chúng trong một mảng đa chiều. Sử dụng mã dưới đây:

<?php 
/** 
* Function for recursive directory file list search as an array. 
* 
* @param mixed $dir Main Directory Path. 
* 
* @return array 
*/ 
function listFolderFiles($dir) 
{ 
    $fileInfo  = scandir($dir); 
    $allFileLists = []; 

    foreach ($fileInfo as $folder) { 
     if ($folder !== '.' && $folder !== '..') { 
      if (is_dir($dir . DIRECTORY_SEPARATOR . $folder) === true) { 
       $allFileLists[$folder] = listFolderFiles($dir . DIRECTORY_SEPARATOR . $folder); 
      } else { 
       $allFileLists[$folder] = $folder; 
      } 
     } 
    } 

    return $allFileLists; 
}//end listFolderFiles() 


$dir = listFolderFiles('your searching directory path ex:-F:\xampp\htdocs\abc'); 
echo '<pre>'; 
print_r($dir); 
echo '</pre>' 

?> 
0

Đây là một chức năng đơn giản với scandir & array_filter rằng thực hiện công việc. lọc các tệp cần thiết bằng regex. Tôi đã xóa ... và các tệp bị ẩn như .htaccess, bạn cũng có thể tùy chỉnh đầu ra bằng cách sử dụng <ul> và màu sắc cũng như tùy chỉnh lỗi trong trường hợp không có thư mục quét hoặc rỗng.

function getAllContentOfLocation($loc) 
{ 
    $scandir = scandir($loc); 

    $scandir = array_filter($scandir, function($element){ 

     return !preg_match('/^\./', $element); 

    }); 

    if(empty($scandir)) echo '<li style="color:red">Empty Dir</li>'; 

    foreach($scandir as $file){ 

     $baseLink = $loc . DIRECTORY_SEPARATOR . $file; 

     echo '<ol>'; 
     if(is_dir($baseLink)) 
     { 
      echo '<li style="font-weight:bold;color:blue">'.$file.'</li>'; 
      getAllContentOfLocation($baseLink); 

     }else{ 
      echo '<li>'.$file.'</li>'; 
     } 
     echo '</ol>'; 
    } 
} 
//Call function and set location that you want to scan 
getAllContentOfLocation('../app'); 
Các vấn đề liên quan