mostrar - Listado de todas las carpetas subcarpetas y archivos en un directorio usando php
mostrar todas las imagenes de una carpeta html (14)
Aquí hay una función simple con scandir
y array_filter
que hacen el trabajo. filtrar los archivos necesarios usando regex. Yo eliminé ..
y archivos ocultos como .htaccess
, también puedes personalizar los resultados usando <ul>
y colores y también personalizar los errores en caso de que no haya escaneos o directorios vacíos.
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'');
Por favor, dame una solución para listar todas las carpetas, subcarpetas, archivos en un directorio usando php. Mi estructura de carpetas es así:
Main Dir
Dir1
SubDir1
File1
File2
SubDir2
File3
File4
Dir2
SubDir3
File5
File6
SubDir4
File7
File8
Quiero obtener la lista de todos los archivos dentro de cada carpeta.
¿Hay algún comando de script de shell en php?
Eche un vistazo a glob() o al RecursiveDirectoryIterator .
En caso de que quiera usar directoryIterator
La siguiente función es una reimplementación de la respuesta @Shef con 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'');
Este código enumera todos los directorios y archivos en orden ordenado en una vista de árbol. Es un generador de mapas de sitio con hipervínculos a todos los recursos del sitio. La fuente completa de la página web está aquí. Tendrá que cambiar la ruta en la novena línea desde el final.
<?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>
Lo usará para hacer la barra de menú en formato de directorio
$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>
Si está buscando un directorio recursivo que liste las soluciones y las organice en una matriz multidimensional. Use el siguiente código:
<?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>''
?>
Soy muy aficionado a SPL Library, ofrecen iterator''s, incluido RecursiveDirectoryIterator .
También puedes probar esto:
<?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);
?>
Tarde para el espectáculo, pero para construir de la respuesta aceptada ...
Si desea tener todos los archivos y directorios en forma de matriz (que puede ser JSON.stringify muy bien con JSON.stringify en javascript), puede modificar la función para:
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;
}
Para los novatos ...
Para usar el JSON.stringify
antes mencionado, su JS / jQuery sería algo así como:
var ajax = $.ajax({
method: ''POST'',
data: {list_dirs: true}
}).done(function(msg) {
$(''pre'').html(
''FILE LAYOUT<br/>'' +
JSON.stringify(JSON.parse(msg), null, 4)
);
});
^ Esto supone que tienes un elemento <pre>
en tu HTML en alguna parte. Cualquier sabor de AJAX servirá, pero creo que la mayoría de la gente está usando algo similar al jQuery anterior.
Y el PHP que lo acompaña:
if(isset($_POST[''list_dirs''])) {
echo json_encode(listFolderFiles($rootPath));
exit();
}
donde ya tiene listFolderFiles
desde antes.
En mi caso, establecí mi $rootPath
en el directorio raíz del sitio ...
$rootPath;
if(!isset($rootPath)) {
$rootPath = $_SERVER[''DOCUMENT_ROOT''];
}
El resultado final es algo así como ...
| 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...
Nota: El suyo no se verá exactamente así: he modificado JSON.stringify
para mostrar pestañas (tubos verticales), alinear todos los valores con clave, quitar citas de las teclas y un par de otras cosas. Modificaré esta respuesta con un enlace si alguna vez llego a subirlo o si tengo suficiente interés.
Una forma muy simple de mostrar la estructura de carpetas hace uso de la clase RecursiveTreeIterator
(PHP 5> = 5.3.0, PHP 7) y genera un árbol de gráficos 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
También hay cierto control sobre la representación ASCII del árbol cambiando los prefijos usando RecursiveTreeIterator::setPrefixPart
, por ejemplo $it->setPrefixPart(RecursiveTreeIterator::PREFIX_LEFT, "|");
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'');
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>'';
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);
}
}