справка со Сценарием PHP для списка каталога должна быть рекурсивной

У меня есть сценарий 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>
5
задан jz3 8 July 2010 в 14:18
поделиться

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

3
ответ дан 14 December 2019 в 18:55
поделиться

Во-первых, ваша структура кода выглядит ужасно - не уверен, было ли это копией и вставкой или что-то в этом роде. Но в настоящее время вы создаете ссылку на каталог, а не снова вызываете скрипт.Попробуйте следующее:

<?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>

При такой настройке все каталоги будут перечислены первыми, а не в алфавитном порядке, как в первом примере.

2
ответ дан 14 December 2019 в 18:55
поделиться

Попробуйте RecursiveIterator-Class и DirectoryIterator, которые поставляются в SPL (стандартная библиотека PHP). Она поставляется вместе с PHP, поэтому вы можете просмотреть документацию на php.net.

Смотрите эту ссылку:

0
ответ дан 14 December 2019 в 18:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: