2011-08-19 133 views

回答

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

謝謝Shef它工作正常他們的任何shell命令執行此? – Warrior

+2

'php file_name.php'? – Shef

+1

不,我問你是否有任何單一的shell腳本列出所有的文件夾和文件,如esec(查找) – Warrior

0

你也可以試試這個:

<?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

這個代碼列出所有目錄和文件的樹狀視圖排序順序。這是一個站點地圖生成器,具有所有站點資源的超鏈接。完整的網頁源代碼在這裏。您需要從最後改變第九行的路徑。

<?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

我愛你的解決方案。 –

+0

優秀的解決方案,是否容易讓它更漂亮? – Kilisi

9

如果你想使用directoryIterator

下面的函數重新實現@Shef答案與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

一個非常簡單的方式來顯示文件夾結構利用了RecursiveTreeIterator類(PHP 5> = 5.3.0,PHP 7)並生成一個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

也有通過改變使用RecursiveTreeIterator::setPrefixPart前綴樹多的ASCII表示一定的控制,例如$it->setPrefixPart(RecursiveTreeIterator::PREFIX_LEFT, "|");

+0

正是我所需要的,我更改爲$ dir,RecursiveDirectoryIterator :: SKIP_DOTS | FilesystemIterator :: UNIX_PATHS)來獲得斜槓。但無法想象如何避免| | | | - 沒有str_replace –

+0

@ Reign.85我也沒有設法避免這些字符。我不確定班級是否提供了一種方式...... –

0

晚的演出,而是建立關accepted answer的...

如果你想要所有的文件和目錄在數組中(這可以用在JavaScript中JSON.stringify很好地預裝),你c的修改功能:

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

對於新手...

使用上述JSON.stringify,你的JS/jQuery的會是這樣的:

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

^這是假設你的HTML中有一個<pre>元素。任何AJAX的味道都可以,但我想大多數人都在使用類似於上面的jQuery的東西。

和附帶的PHP:

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

,你已經有listFolderFiles從之前。

就我而言,我已經把我的$rootPath到網站的根目錄...

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

最終的結果是一樣的東西......

| 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... 

注:你的看起來不會像這樣 - 我修改了JSON.stringify來顯示標籤(垂直管道),對齊所有鍵值,刪除鍵引號和其他一些東西。如果我想要上傳它,或者獲得足夠的興趣,我會通過鏈接修改此答案。

1

它將使用,使菜單欄在目錄格式

$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

如果你正在尋找一個遞歸目錄列表的解決方案和多維數組進行排列。使用下面的代碼:

<?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

這裏是scandir & array_filter來完成這項工作的簡單功能。使用正則表達式過濾 需要的文件。我刪除了...和隱藏文件如.htaccess,您還可以使用<ul>和顏色自定義輸出,並且還可以自定義錯誤,以防沒有掃描或空目錄!

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'); 
相關問題