0
<?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/ディレクトリ内の 1 つのフォルダーを検出するだけで (すべてのファイルがインデックスを作成する必要がある場合)、サブフォルダー内またはサブフォルダー外のファイルを完全に見逃しています。サブフォルダーをクリックすると、メインフォルダーのように動作し続けます(files/)。

これを解決するにはどうすればよいですか?

別の質問ですが、 or を使用する必要がありますglobscandir? 〜80個のファイルしか含まれないため、PHP.netページに記載されているようなmemory_limitの問題に対処する必要はありません。

非常に多くのファイルが保存されているディレクトリ (>100.000) 内のファイルを一覧表示しようとする場合は、glob() を使用しないでください。「XYZ バイトの許容メモリ サイズが使い果たされました ...」というエラーが表示されます。php.ini の memory_limit 変数を増やしてみてください。私には128MBが設定されており、500.000を超えるファイルをglob()している間、スクリプトはまだこの制限に達します。


Barmar のソリューションの後に更新されたコード:

<?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>';
                    }
                }
            }
        ?>
4

1 に答える 1