4

我正在为我的公司编写一个简单的网络报告系统。我为 index.php 编写了一个脚本,它获取“reports”目录中的文件列表并自动创建指向该报告的链接。它工作正常,但我的问题是 readdir() 不断返回 . 和 .. 目录指针以及目录的内容。除了遍历返回的数组并手动剥离它们之外,有什么方法可以防止这种情况发生吗?

这是好奇的相关代码:

//Open the "reports" directory
$reportDir = opendir('reports');

//Loop through each file
while (false !== ($report = readdir($reportDir)))
{
  //Convert the filename to a proper title format
  $reportTitle = str_replace(array('_', '.php'), array(' ', ''), $report);
  $reportTitle = strtolower($reportTitle);
  $reportTitle = ucwords($reportTitle);

  //Output link
  echo "<a href=\"viewreport.php?" . $report . "\">$reportTitle</a><br />";
}

//Close the directory
closedir($reportDir);
4

5 回答 5

18

在上面的代码中,您可以附加为while循环中的第一行:

if ($report == '.' or $report == '..') continue;
于 2009-10-06T14:17:43.623 回答
4
array_diff(scandir($reportDir), array('.', '..'))

甚至更好:

foreach(glob($dir.'*.php') as $file) {
    # do your thing
}
于 2009-10-06T14:17:20.340 回答
2

不,这些文件属于一个目录,readdir因此应该返回它们。我认为所有其他行为都被打破了。

无论如何,跳过它们:

while (false !== ($report = readdir($reportDir)))
{
  if (($report == ".") || ($report == ".."))
  {
     continue;
  }
  ...
}
于 2009-10-06T14:18:46.960 回答
1

我不知道另一种方式,如“。” 和“..”也是正确的目录。当您无论如何都在循环以形成正确的报告 URL 时,您可能只需添加一些if忽略...进行进一步处理的内容。

编辑
Paul Lammertsma 比我快一点。这就是您想要的解决方案;-)

于 2009-10-06T14:18:11.717 回答
0

我想检查“。” 和“..”目录以及根据我存储在目录中的内容可能无效的任何文件,因此我使用了:

while (false !== ($report = readdir($reportDir)))
{
    if (strlen($report) < 8) continue;
    // do processing
}
于 2019-04-16T14:38:17.140 回答