使用php列出目录中的所有文件夹、子文件夹和文件

80
请给我一个使用PHP列出目录中所有文件夹、子文件夹和文件的解决方案。我的文件夹结构如下:
Main Dir
 Dir1
  SubDir1
   File1
   File2
  SubDir2
   File3
   File4
 Dir2
  SubDir3
   File5
   File6
  SubDir4
   File7
   File8

我想要获取每个文件夹内所有文件的列表。

在PHP中是否有任何shell脚本命令?

20个回答

2

这是另一个用生成器实现的递归scandir()函数。该生成器会产生完整的路径(以"basedir/subdirs.../file"的形式),因此不太适合用于树形显示,但非常适合目录扫描,您可以在其中对文件路径进行其他操作,例如展示图像画廊。

function listFolderFiles($dir){
    foreach(scandir($dir) as $file){
        if ($file[0] == '.')
            continue;
        if (is_dir("$dir/$file"))
            foreach (listFolderFiles("$dir/$file") as $infile)
                yield $infile;
        else
            yield "${dir}/${file}";
    }
}

这一实现通过跳过所有UNIX隐藏文件(以句点开头的文件)来跳过目录指针 - 如果你想要获取“隐藏”文件,则需要将目录指针跳过方法更改为其他内容。

你可以像这样使用它:

<?php foreach (listFolderFiles('.') as $file) {
    ?>
    <?php echo $file?><br/>
    <?php
}?>

2

2

1
这是我的便捷方法,采用PHP 7风格:
  /**
     * @param string $directory
     *
     * @return SplFileInfo[]
     */
    private function getAllFiles(string $directory = './'): array
    {
        $result = [];

        $iterator = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($directory), RecursiveIteratorIterator::SELF_FIRST );
        /** @var $fileInfo SplFileInfo */
        foreach ($iterator as $fileInfo ) {

            if ($fileInfo->isFile()) {
               $result[] = $fileInfo;
            }
        }

        return $result;
    }

0
这篇文章是为Shef(发布正确答案的人)而写的。这是我能想到的唯一方式,向他展示我对他的代码以及我用它所做的一切有多么感激。
<!DOCTYPE html>
<head><title>Displays Folder Contents</title></head>
<?php

function frmtFolder($Entity){
 echo '<li style="font-weight:bold;color:black;list-style-type:none">' . $Entity;
}

function frmtFile($dEntry, $fEntry){
echo '<li style="list-style-type:square">' . '<a href="' . $dEntry . '/' . $fEntry . 
'"> ' . $fEntry . ' </a>';
}

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

unset($ffs[array_search('.', $ffs, true)]);
unset($ffs[array_search('..', $ffs, true)]);
unset($ffs[array_search('index.html', $ffs, true)]);
// prevent empty ordered elements
if (count($ffs) < 1) {return;}
echo '<ul>';
foreach ($ffs as $ff) {
    if (is_dir($dir . '/' . $ff)) {
     frmtFolder($dir);
    } else {
     frmtFile($dir, $ff);
    }
    if (is_dir($dir . '/' . $ff)) {
        listFolderFiles($dir . '/' . $ff);
    }
    echo '</li>';
}
echo '</ul>';
}
listFolderFiles('Folder_To_List_Here');

我计划在未来扩展frmtFile以使用音频和视频标签。


0

虽然来晚了,但是基于被接受的答案继续建立...

如果你想要将所有文件和目录作为数组(可以在javascript中使用JSON.stringify进行美化),你可以修改函数如下:

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函数以显示制表符(竖线),对齐所有键值,去掉键上的引号等。如果我有时间上传或者有足够的兴趣,我会在回答中提供一个链接。


0

https://3v4l.org/VsQLb 这里有个例子

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

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接