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,

理解できないこと: すべてのフォルダーを表示する前に、最初の行は.、2 番目の行は で..、次にフォルダー名が表示されます。例:

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

...は各ディレクトリの(仮想)ノードでもあるため、このリストは正しいです。ドットで始まるファイル/フォルダーの出力を抑制したい場合(Apacheがデフォルト構成で行うように)、指定さvalid()れたコードで自分で適切なチェックを実装する必要があります。

ディレクトリが構築されると、最初に2つの特別なファイルのファイル名部分が入力されます:「。」および「..」ファイル。'。'のファイル名部分 ファイルには、エントリが作成されたディレクトリファイルのiノード番号が入力されます。'。' 現在のディレクトリを実装するファイルへのハードリンクです。

'..'ファイルのファイル名部分には、現在のディレクトリファイルのファイル名部分を含むディレクトリファイルのiノード番号が入力されます。'..'は、現在のディレクトリの直接の親を実装するファイルへのハードリンクです。

出典: 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 に答える