2013-08-16 14 views
5

ディレクトリ内からファイルを選択するための再帰的なディレクトリイテレータがあります。 SKIP_DOTSは私に 'を無視することができます。そして、「..」要素が、私はまた、 『__MACOSX』ディレクトリと、そのような「.cache.php」などの別の他の隠しファイルを無視できるようにしたいと思いPHP再帰ディレクトリイテレータ - 特定のファイルを無視します。

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

他の回答herehereがありますが、よりクリーンな方法があるのか​​どうか疑問に思っただけですか?

PHP Manual - FilesystemIterator SetFlagsに何かがあることを期待していましたが、そう思われませんでした。

+0

なぜあなたは、組み込みの何かを望んでいたあたりとしてRecursiveFilterIterator

class MyRecursiveFilterIterator extends RecursiveFilterIterator { public static $FILTERS = array( '__MACOSX', ); public function accept() { return !in_array( $this->current()->getFilename(), self::$FILTERS, true ); } } 

を拡張しましたか?特別な要件があるときにコードのいくつかの行を書くことを誰かが期待するのは無理でしょうか? Windowsシステムでは、特別な 'desktop.ini'と' Thumbs.db'ファイルが表示されることがよくあります。 – Jon

+0

それが役立つことがあります:http://stackoverflow.com/questions/12454114/exclude-folders-from-recursion-in-recursive-directory-iterator-php –

+0

@ジョン私はあなたのポイントを参照してくださいが、なぜ 'RecursiveDirectoryIterator ::一般的な使用例を手助けしない場合は:: SKIP_DOTS ' – Kiksy

答えて

8

ありがとう:

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

$filter = new MyRecursiveFilterIterator($iterator); 

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

は次にコメントIn the PHP Manual

+0

これは、 'RecursiveDirectoryIterator'フラグが設定されているかどうかによって異なります。ここでコードは' parent :: current() 'が' SplFileInfo'オブジェクトを返すことを期待しています。別の方法として、 'RecursiveDirectoryIterator'自体で動作し、' $ this-> getBasename() '(フィルタを装飾する)または' $ this-> getFilename() 'を使用することができます。ただ追加する。コンストラクタ内で '$ iterator'として' RecursiveDirectoryIterator'だけを受け入れるように気をつけておくことも役に立ちます。私はLinuxの隠しファイルの要点にいくつかのコードを入れました:['HiddenFilesAndFolderFilterIterator.php'](https://gist.github.com/hakre/11111534) – hakre

1

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

"__MACOSX"ディレクトリのような特殊なケースでは、定義済みのSKIP定数はありません。 @SvenおよびPHPドキュメントへ

関連する問題