为文件夹编制索引:未检测到目录


Indexing folders: Not detecting a directory

<?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 资源管理器中看到的那样(不是 ie!但是我目前拥有的脚本只是检测files/目录中的一个文件夹(所有文件都是我要索引的(,并且完全错过了子文件夹中或外部的文件。当我单击子文件夹时,它一直像在主文件夹中一样运行(files/(。

我该如何解决这个问题?

另一个问题,我应该使用glob还是scandir?它只会包含~80个文件,所以我不必像 PHP.net 页面上指出的那样处理memory_limit问题:

如果您尝试列出存储大量文件的目录中的文件,请不要使用 glob(( (>100.000(。您得到一个"XYZ 字节的允许内存大小已耗尽..."错误。 您可以尝试在 php.ini 中增加 memory_limit 变量。我的设置了 128MB,当 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>';
                    }
                }
            }
        ?>

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= 使其递归到子目录中。