【问题标题】:Indexing folders: Not detecting a directory索引文件夹:未检测到目录
【发布时间】:2013-06-26 19:24:04
【问题描述】:
<?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 page 上的注释那样处理 memory_limit 问题:

如果您尝试列出存储大量文件 (>100.000) 的目录中的文件,请不要使用 glob()。您会收到“已用完的 XYZ 字节的允许内存大小...”错误。 您可以尝试增加 php.ini 中的 memory_limit 变量。我的设置了 128MB,当 glob() 处理超过 500.000 个文件时,脚本仍将达到此限制。


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

【问题讨论】:

标签: php file glob readdir scandir


【解决方案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= 使其递归到子目录中。

【讨论】:

  • 我有files.php?,因为这将是该目录中文件的直接链接。现在我已经更正了,它会检测到我放入 files/folder1/ 的虚拟文件,但它会将其作为文件夹读取。所以它将files/folder1/列为一个文件夹,files/dummy.txt列为一个文件夹,当我进入files/folder1/时,它检测到files/folder1/dummy.txt也作为一个文件夹。 (使用我当前的代码查看更新的问题)
  • 您仍然需要文件的直接链接中的目录前缀。我已经更新了我对那个案例的回答。
  • 我发现了问题。我们也忘了更改is_file 函数中的路径。 '猜猜我们都是人类。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-11-18
  • 1970-01-01
  • 2018-07-16
  • 2021-04-23
  • 2012-11-15
  • 1970-01-01
  • 2018-07-31
相关资源
最近更新 更多