<?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 explorer中看到的那样(不是!)。但是我现在的脚本只检测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>';
}
}
}
?>
答案 0 :(得分: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=
将其递归到子目录中。