У меня есть сценарий PHP, который читает каталог и перечисляет все файлы/каталоги в форме ссылки, и она работает, кроме я пытаюсь заставить ее быть рекурсивной так, чтобы, когда я выбираю другой каталог, он еще раз использовал сценарий для отображения файлов внутри. Прямо сейчас то, когда я выбираю каталог, он просто переходит к апачам по умолчанию, перечисляющим.... любую справку, ценится.
Сценарий:
<?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>
Посмотрите на Directory Iterator и Recursive Iterator
http://php.net/manual/en/class.directoryiterator.php
или даже на Recursive Directory Iterator
http://www.php.net/manual/en/class.recursivedirectoryiterator.php
Во-первых, ваша структура кода выглядит ужасно - не уверен, было ли это копией и вставкой или что-то в этом роде. Но в настоящее время вы создаете ссылку на каталог, а не снова вызываете скрипт.Попробуйте следующее:
<?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>
Возможно, вам придется немного подправить его для работы с вашей системой. Однако идея такова: если это файл, он загружает путь к файлу непосредственно в браузер, если это каталог, снова вызывайте скрипт с новым именем каталога. Вы могли бы уточнить что-то вроде этого:
<?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>
При такой настройке все каталоги будут перечислены первыми, а не в алфавитном порядке, как в первом примере.
Попробуйте RecursiveIterator-Class и DirectoryIterator, которые поставляются в SPL (стандартная библиотека PHP). Она поставляется вместе с PHP, поэтому вы можете просмотреть документацию на php.net.
Смотрите эту ссылку: