7

ディレクトリ内からファイルを選択するための再帰的なディレクトリ イテレータがあります。SKIP_DOTS を使用すると、「.」を無視できます。および「..」要素ですが、「__MACOSX」ディレクトリや「.cache.php」などの他の隠しファイルも無視できるようにしたいと思います

$iterator = new RecursiveDirectoryIterator($directory);
$iterator->setFlags(RecursiveDirectoryIterator::SKIP_DOTS);
$all_files  = new RecursiveIteratorIterator($iterator); 

ここここに他の答えがありますが、よりクリーンな方法があるかどうか疑問に思いましたか?

PHP Manual - FilesystemIterator SetFlagsに何かがあることを期待していましたが、そうではないようです。

4

3 に答える 3

11

@Sven と PHP ドキュメントに感謝します。

$iterator = new RecursiveDirectoryIterator($directory);
$iterator->setFlags(RecursiveDirectoryIterator::SKIP_DOTS);

$filter = new MyRecursiveFilterIterator($iterator);

$all_files  = new RecursiveIteratorIterator($filter,RecursiveIteratorIterator::SELF_FIRST);

次にRecursiveFilterIterator を拡張

class MyRecursiveFilterIterator extends RecursiveFilterIterator {

    public static $FILTERS = array(
        '__MACOSX',
    );

    public function accept() {
        return !in_array(
            $this->current()->getFilename(),
            self::$FILTERS,
            true
        );
    }

}

PHPマニュアルのコメントに従って

于 2013-08-16T10:30:16.020 に答える
1

RecursiveIteratorIterator と RecursiveDirectoryIterator の間にフィルター レイヤーを追加します。 RecursiveFilterIterator を作成しaccept()、要素を結果に含める場合は true を返す関数をコーディングします。ディレクトリ反復子をフィルター反復子に入れ、フィルター反復子を RecursiveIteratorIterator に入れます。繰り返します。

「__MACOSX」ディレクトリなどの特殊なケース用に事前定義された SKIP 定数はありません。

于 2013-08-16T10:01:26.193 に答える