帮助PHP脚本列出目录需要递归

时间:2010-07-08 14:18:06

标签: php apache

我有一个php脚本,它读取一个目录,并以链接形式列出所有文件/目录,并且它可以工作,除了我试图让它递归,这样当我选择另一个目录时,它再次使用脚本显示里面的文件。现在,当我选择一个目录时,它只会转到默认的apache列表....任何帮助都表示赞赏。

脚本:

    <?php
$dirname = '/drives/Storage/AppsOSs/';
$webdirname = '/AppsOSs'; // what the directory appears as from the web browser's point of view

$dir = opendir($dirname);
$file_list = '';

while(($file = readdir($dir)) != false) {
if(($file != '.') && ($file != '..')) {
$file_list .= "<a href=\"$webdirname/$file\">$file</a><br/>";
}
}

closedir($dir);
?>

<p>
<?=$file_list?>
</p>

3 个答案:

答案 0 :(得分:3)

查看Directory Iterator和Recursive Iterator

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

甚至是Recursive Directory Iterator

http://www.php.net/manual/en/class.recursivedirectoryiterator.php

答案 1 :(得分:2)

首先,你的代码结构看起来很可怕 - 不确定这是复制和粘贴的东西还是什么。但是,就目前而言,您正在创建指向目录的链接,而不是再次调用脚本。试试这个:

<?php
$dirname = ( isset($_GET['dir']) ) ? $_GET['dir'] : '/drives/Storage/AppsOSs/';

if( !$dir = opendir($dirname) )
{
    die("Unable to open $dirname");
}

$file_list = "";

while( ($file = readdir($dir)) !== false)
{
    if( ($file != '.') && ($file != '..') )
    {
        if( is_dir($dirname . $file) )
        {
            $file_list .= "<a href=\"" . $_SERVER['PHP_SELF'] . "?dir=" . $dirname . $file . "\">" . $file . "</a><br/>";
        }
        else
        {
            $file_list .= "<a href=\"$dirname/$file\">$file</a><br/>";
        }
    }
}

closedir($dir);
?>

<p>
<?= $file_list; ?>
</p>

您可能需要稍微调整一下才能使用您的系统。但是这个想法是:如果它是一个文件,它会直接将文件路径加载到浏览器中,如果它是一个目录,则使用新的dirname再次调用脚本。你可以用这样的东西进一步阐述:

<?php
$dirname = ( isset($_GET['dir']) ) ? $_GET['dir'] : '/drives/Storage/AppsOSs/';

if( !$dir = opendir($dirname) )
{
    die("Unable to open $dirname");
}

$dir_arr = array();
$file_arr = array();

while( ($file = readdir($dir)) !== false)
{
    if( ($file != '.') && ($file != '..') )
    {
        if( is_dir($dirname . $file) )
        {
            $dir_arr[] = "<a href=\"" . $_SERVER['PHP_SELF'] . "?dir=" . $dirname . $file . "\">" . $file . "</a>";
        }
        else
        {
            $file_arr[] = "<a href=\"$dirname/$file\">$file</a>";
        }
    }
}

closedir($dir);

$dir_list = implode("<br/>", $dir_arr);
$file_list = implode("<br/>", $file_arr);
?>

<p>
<?= "<h1>Directories</h1>" . $dir_list . "<h1>Files</h1>" . $file_list; ?>
</p>

使用此设置,所有目录将首先列出 - 而不是像第一个示例中那样按字母顺序混合。

答案 2 :(得分:0)

尝试由SPL(标准PHP库)提供的RecursiveIterator-Class和DirectoryIterator。它附带PHP,因此您可以在php.net上查看文档。

请看这个链接: