我试图理解从这段代码得到的部分输出:
<?php
class DirectoryReader extends DirectoryIterator
{
function __construct($path)
{
parent::__construct($path);
}
function current()
{
return parent::getFileName();
}
function valid()
{
if(parent::valid())
{
if (!parent::isDir())
{
parent::next();
return $this->valid();
}
return TRUE;
}
return FALSE;
}
}
try
{
$it = new DirectoryReader('C:\wamp\www');
while($it->valid())
{
echo $it->current().'<br />';
$it->next();
}
}
catch(Exception $e)
{
echo 'No files Found!<br />';
}
?>
在代码中,您可以看到我将此路径传递给构造函数:C:\wamp\www
,
我不明白:在我看到所有文件夹之前,第一行是.
,第二行是..
,然后我可以看到文件夹名称,例如:
.
..
someFolder
someOtherFolder
我知道.
显示当前文件夹,而..
正在返回文件夹层次结构,但我无法理解为什么会打印.
然后{{1}然后是文件夹?
我真的很想了解这个迭代器的动作,如果有人可以帮助我理解我会非常感激。
答案 0 :(得分:2)
如果您不想显示。和...(正如其他优秀答案中所解释的)这个片段直接取自manual page comments。
显示目录中除“。”之外的所有文件和目录。和“..”。
<?php
foreach (new DirectoryIterator('../moodle') as $fileInfo) {
if($fileInfo->isDot()) continue;
echo $fileInfo->getFilename() . "<br>\n";
}
修改强>
FilesystemIterator
优先于DirectoryIterator
。使用前者时,默认情况下会跳过点文件(有一个标志来控制此行为)。
<?php
foreach (new FilesystemIterator('../moodle') as $fileinfo) {
echo $fileinfo->getFilename() . "<br>\n";
}
答案 1 :(得分:2)
代码parent::isDir()
会为点目录返回TRUE
,这意味着您自己的valid()
方法也会返回TRUE
。
您可以修改方法,以查看isDot()
是否返回TRUE
或FALSE
并做出相应的回复。
function valid()
{
return $this->isDir() && !$this->isDot();
}
答案 2 :(得分:1)
该列表是正确的,因为.
和..
也是每个目录中的(虚拟)节点。如果要禁止以点开头的文件/文件夹的输出(如默认配置中的Apache那样),则必须在给定代码中的valid()
中自行执行适当的检查。
当构建目录时,它最初填充了两个特殊文件的文件名部分:'。'和'..'文件。 '。'的文件名部分file使用已在其中创建条目的目录文件的inode#填充; ''是实现当前目录的文件的硬链接。
“..”文件的文件名部分填充目录文件的inode#,该文件包含当前目录文件的文件名部分。 '..'是实现当前目录的直接父级的文件的硬链接。
答案 3 :(得分:1)
打印出来。和..因为该类只检查文件夹是否是两者的目录。和..是
答案 4 :(得分:0)
此外,结果被排序,这就是为什么'。'来自'..'和'some_other_directories'之前。