【发布时间】: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.net/manual/en/class.recursivedirectoryiterator.php
-
要解决其他问题(保持在同一路径中)将 ?path= 更改为 ?dir=
-
@RobW 我已经检查过了,但这似乎比这需要更难。
标签: php file glob readdir scandir