【问题标题】:Can't get php to display directory and fgets?无法让 php 显示目录和 fgets?
【发布时间】:2012-07-18 02:05:41
【问题描述】:

我只是在尝试在一个目录中显示所有文件,然后使用 fgets 在它们旁边显示一些信息。我似乎无法让它工作。我现在有点讨厌 php,但我基本上希望它显示一个 tr,每个 tr 有两个 td。一个带有文件名的 td,另一个带有“描述”的 td,这只是我在文件第一部分中放入的一些信息。

<table>
<?php
if ($handle = opendir('desktop/')) {
while (false !== ($file = readdir($handle))) {
    if ($file != "." && $file != "..") {

      $string = "$file";     


$searchArray = array("_", ".php");
$replaceArray = array("", "");
$string = str_replace($searchArray,$replaceArray,$string);
$handle = @fopen("desktop/$file", "r");
if ($handle) {
while (($buffer = fgets($handle, 4096)) !== false) {
    echo $buffer;
}
if (!feof($handle)) {
    echo "Error: unexpected fgets() fail\n";
}
fclose($handle);
}
echo "<tr><td><a href=desktop/$file>$string\n</a></td><td>$buffer</td></tr>"; 
    }
}
closedir($handle);
}
?>
</table>

【问题讨论】:

  • 有什么问题?你的目录有什么权限?您是否受到文件遍历攻击的保护?
  • 警告:readdir(): 5 is not a valid Directory resource in C:\wamp\www\tech\pc.php on line 16 Warning: closedir(): 5 is not a valid Directory resource在 C:\wamp\www\tech\pc.php 第 38 行
  • 确认一下,var_dump($handle) 是否显示bool(false)
  • 您可能想要包装 href attr 的值。在引号内,作为开始:&lt;a href=\"desktop/$file\"&gt;
  • This answer 似乎暗示资源已经关闭,但我不能说为什么会这样......

标签: php directory filenames fgets


【解决方案1】:

您重新定义了导致您的问题的“$handle”。

$handle 最初是保存“目录”资源的变量。然后,您重新使用它来保存文件资源。然后当你返回目录资源来获取下一个文件的名称时,$handle 不再是目录资源,而是一个文件——所以问题就出现了。

调用第一个“$dirHandle”和第二个“$fileHandle”,这样会更清楚?


编辑:如何只获取第一行(根据 cmets 的要求):

if ($handle) { 
    if (($buffer = fgets($handle, 4096)) !== false) { 
        echo "<tr><td><a href=desktop/$file>$string\n</a></td><td>$buffer</td></tr>";  
    }
} 

(注意:您可能还想使用 htmlspecialchars() 使其更安全)

【讨论】:

  • 我是这么想的,我之前试过了,但出了点问题,但我会再试一次:P
  • fgets 一次获取一行。您的代码说“获取一行,如果不是最后一行,请接我下一个,如果不是最后一行,请接我下一行,等等”。因此,将您的“while”更改为包围 fget 的“if”。请参阅答案中的编辑。
  • 谢谢兄弟!我真的很感激!
  • 最快的方法:if (is_file($file)). PHP 手册非常适合这样的事情;)。否则我会带你去 DirectoryIterator 和对象路线,这实际上给了你更多的控制权...php.net/manual/en/class.recursivedirectoryiterator.php(查看第一个 cmets 以获取示例,但不要逐字复制并使用“取消链接”,这实际上意味着“删除”!)
猜你喜欢
  • 2018-10-11
  • 2016-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-04
  • 2015-07-31
  • 2019-04-18
  • 2023-03-20
相关资源
最近更新 更多