Пожалуйста, дайте мне решение для перечисления всех папок, подпапок, файлов в каталоге с помощью php. Моя структура папок выглядит так:
Main Dir Dir1 SubDir1 File1 File2 SubDir2 File3 File4 Dir2 SubDir3 File5 File6 SubDir4 File7 File8
Я хочу получить список всех файлов внутри каждой папки.
Есть ли какая-либо команда скрипта в php?
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');
Этот код перечисляет все каталоги и файлы в отсортированном порядке в виде дерева. Это генератор карты сайта с гиперссылками ко всем ресурсам сайта. Здесь находится полный источник веб-страницы. Вам нужно будет изменить путь на девятой строке с конца.
<?php $pathLen = 0; function prePad($level) { $ss = ""; for ($ii = 0; $ii < $level; $ii++) { $ss = $ss . "| "; } 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>
Если вы хотите использовать 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');
Очень простой способ показать структуру папок использует класс 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
Существует также некоторый контроль над представлением ASCII дерева путем изменения префиксов с помощью RecursiveTreeIterator::setPrefixPart
, например $it->setPrefixPart(RecursiveTreeIterator::PREFIX_LEFT, "|");
Я очень люблю библиотеку SPL, они предлагают итераторы, в том числе RecursiveDirectoryIterator .
Посмотрите glob () или рекурсивный итератор каталогов .
Он будет использоваться для создания строки меню в формате каталога
$pathLen = 0; function prePad($level) { $ss = ""; for ($ii = 0; $ii < $level; $ii++) { $ss = $ss . "| "; } 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>
Вы также можете попробовать следующее:
<?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); ?>
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>';
Поздно к шоу, но для того, чтобы опираться на принятый ответ …
Если вы хотите, чтобы все файлы и каталоги были в виде массива (которые можно красиво сочетать с JSON.stringify в javascript), вы можете изменить функцию:
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
чтобы отображать вкладки (вертикальные трубы), выровнять все ключевые значения, удалять цитаты с клавиш и пару других вещей. Я изменю этот ответ ссылкой, если я когда-нибудь доберусь до него, или получаю достаточный интерес.
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); }
}
Если вы ищете рекурсивный список каталогов решений и упорядочиваете их в многомерном массиве. Используйте нижеприведенный код:
<?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>' ?>
Вот простая функция с scandir
и array_filter
которые выполняют эту работу. Фильтровать необходимые файлы с помощью regex. Я удалился .
..
и скрытые файлы, такие как .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');