Индексирование папок: каталог не определяется

<?php
$dir = '';

if(isset($_GET['dir']) && !empty($_GET['dir']) && !stristr($_GET['dir'], '.')){
    $dir = '/'. $_GET['dir'];
    echo '<a href="files.php">back to /</a><br><br>';
}

foreach(scandir('files'. $dir) as $filename){
    if($filename == ".." || $filename == "."){
        // do nothing. We want files and folders, not dots.
    }
    else
    {   
        if(is_file($filename)){
            echo '<a href="files/'. $filename .'">'. $filename .'</a><br>';
        }
        else
        {
            echo '<a href="files.php?path='. $filename .'">'. $filename .' (dir)</a><br>';
        }
    }
}
?>

Поэтому я хочу создать индексатор файлов для своего сайта, как если бы вы видели его в проводнике Windows (НЕ т.е.!). Но сценарий, который у меня сейчас есть, просто обнаруживает одну папку в каталоге files/ (все файлы, которые я хочу проиндексировать) и полностью пропускает файлы, внутри или за пределами подпапки. И когда я нажимаю на подпапку, она продолжает действовать так же, как и в основной папке (files/).

Как мне решить эту проблему?

Другой вопрос, использовать glob или scandir? Он будет содержать только ~ 80 файлов, поэтому мне не придется иметь дело с проблемой memory_limit, как это указано в страница PHP.net:

Не используйте glob (), если вы пытаетесь перечислить файлы в каталоге, где хранится очень много файлов (> 100 000). Вы получаете сообщение об ошибке «Допустимый размер памяти в байтах XYZ исчерпан ...». Вы можете попробовать увеличить переменную memory_limit в php.ini. У меня установлено 128 МБ, и скрипт все равно достигнет этого предела, пока glob () обрабатывает более 500 000 файлов.


Обновленный код после решения Бармара:

<?php
            $dir = '';

            if(isset($_GET['dir']) && !empty($_GET['dir']) && !stristr($_GET['dir'], '.')){
                $dir = $_GET['dir'];
                echo '<a href="files.php">Back to /</a><br><br>';
            }

            foreach(scandir('files'. $dir) as $filename){
                if($filename == ".." || $filename == "."){
                    // do nothing. We want files and folders, not dots.
                }
                else
                {   
                    if(is_file($dir .'/'. $filename)){
                        echo '<a href="'. $filename .'">'. $filename .'</a><br>';
                    }
                    else
                    {
                        echo '<a href="files.php?dir='. $dir .'/'. $filename .'">'. $filename .' (dir)</a><br>';
                    }
                }
            }
        ?>

person Thew    schedule 26.06.2013    source источник
comment
Возможно, вы захотите лучше контролировать это. Проверьте: php.net/manual/en/class.recursivedirectoryiterator.php   -  person Rob W    schedule 26.06.2013
comment
Чтобы исправить другую проблему (оставаясь на том же пути), измените? Path = на? Dir =   -  person tlenss    schedule 26.06.2013
comment
@RobW Я проверил это, но это кажется сложнее, чем должно быть.   -  person Thew    schedule 26.06.2013


Ответы (1)


scandir возвращает имена файлов, а не пути, поэтому вам нужно добавить префикс каталога:

foreach(scandir('files'. $dir) as $filename){
    if($filename == ".." || $filename == "."){
        // do nothing. We want files and folders, not dots.
    }
    else
    {   
        if(is_file($filename)){
            echo '<a href="files/'. $dir . '/' . $filename .'">'. $filename .'</a><br>';
        }
        else
        {
            echo '<a href="files.php?dir=' . $dir . '/' . $filename .'">'. $filename .' (dir)</a><br>';
        }
    }
}

Вам также не хватало files.php? в первой ссылке, а во второй ссылке следует использовать dir=, чтобы сделать ее рекурсивной в подкаталог.

person Barmar    schedule 26.06.2013
comment
У меня была files.php? причина, по которой это была бы прямая ссылка на файлы внутри этого каталога. Теперь я исправил это, и он обнаруживает фиктивный файл, который я вставил files/folder1/, но читает его как папку. Таким образом, он перечисляет files/folder1/ как папку, files/dummy.txt как папку, и когда я захожу в files/folder1/, он обнаруживает files/folder1/dummy.txt также как папку. (См. Обновленный вопрос с моим текущим кодом) - person Thew; 26.06.2013
comment
Вам по-прежнему нужен префикс каталога в прямой ссылке на файлы. Я обновил свой ответ на этот случай. - person Barmar; 26.06.2013
comment
Я нашел проблему. Мы также забыли изменить пути в функции is_file. «Думаю, все мы люди. - person Thew; 27.06.2013