我有一个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>
答案 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上查看文档。
请看这个链接: