1

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

<?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

我知道.显示当前文件夹并..返回文件夹层次结构,但我不明白为什么它会先打印.然后..再打印文件夹?我真的很想了解这个迭代器的动作,如果有人可以帮助我理解我将非常感激。

4

5 回答 5

2

万一你不想显示。和..(如其他优秀答案中所述)此片段直接取自手册页评论

向我们显示目录中除“。”之外的所有文件和目录。和 ”..”。

<?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";
}
于 2012-08-01T09:49:39.523 回答
2

代码为点目录parent::isDir()返回,这意味着您自己的方法也为它们返回。TRUEvalid()TRUE

您可以编辑您的方法以查看是否isDot()返回TRUEFALSE相应地响应。

function valid()
{
    return $this->isDir() && !$this->isDot();
}
于 2012-08-01T09:59:08.250 回答
1

该列表是正确的,因为.并且..也是每个目录中的(虚拟)节点。valid()如果你想抑制以点开头的文件/文件夹的输出(就像 Apache 在默认配置中所做的那样),你必须在给定的代码中自己实现适当的检查。

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

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

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

于 2012-08-01T09:42:01.870 回答
1

它打印 . 和 .. 因为该类仅检查该文件夹是否是一个既 . 和..是

于 2012-08-01T09:42:10.043 回答
0

此外,结果是排序的,这就是为什么 '.' 出现在“..”和“some_other_directories”之前。

于 2012-08-01T09:54:41.070 回答