Php,DirectoryIterator

时间:2012-08-01 09:36:46

标签: php

我试图理解从这段代码得到的部分输出:

<?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}然后是文件夹? 我真的很想了解这个迭代器的动作,如果有人可以帮助我理解我会非常感激。

5 个答案:

答案 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()是否返回TRUEFALSE并做出相应的回复。

function valid()
{
    return $this->isDir() && !$this->isDot();
}

答案 2 :(得分:1)

该列表是正确的,因为...也是每个目录中的(虚拟)节点。如果要禁止以点开头的文件/文件夹的输出(如默认配置中的Apache那样),则必须在给定代码中的valid()中自行执行适当的检查。

  

当构建目录时,它最初填充了两个特殊文件的文件名部分:'。'和'..'文件。 '。'的文件名部分file使用已在其中创建条目的目录文件的inode#填充; ''是实现当前目录的文件的硬链接。

     

“..”文件的文件名部分填充目录文件的inode#,该文件包含当前目录文件的文件名部分。 '..'是实现当前目录的直接父级的文件的硬链接。

     

来源:http://linuxgazette.net/105/pitcher.html

答案 3 :(得分:1)

打印出来。和..因为该类只检查文件夹是否是两者的目录。和..是

答案 4 :(得分:0)

此外,结果被排序,这就是为什么'。'来自'..'和'some_other_directories'之前。