配列に対するイテレータ、オブジェクトに対するイテレータと来て次はディレクトリに対するイテレータを使ってみます。
http://docs.php.net/manual/ja/class.directoryiterator.php
$dir=new DirectoryIterator(dirname(__FILE__));
$dir->rewind();
$filename=$dir->current();
var_dump($filename);
object(DirectoryIterator)#2 (0) { }
NO!何だこれ!
DirectoryIterator::current これ自身を返す (Iterator インターフェースに必要)
http://docs.php.net/manual/ja/directoryiterator.current.php
これまでの動作から言うとcurrentメソッドは現在のファイル名を返すべきであるのに、何故かインスタンス自身が返されます。
あと何気にnextで'.'や'..'、ディレクトリとファイルが混ざってやってきたりして面倒です。
ファイルのみを選び出すラッパクラスを作成しましょう。
DirectoryIteratorX.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
class DirectoryIteratorX extends DirectoryIterator{
//次のファイルを取得
function nextFile(){
while($this->valid() && !$this->isFile()){
$this->next();
}
}
//次のディレクトリを取得
function nextDir(){
while($this->valid() && !$this->isDir()){
$this->next();
}
}
//現在のファイルを取得
function current(){
return $this->getFilename();
}
}
$dir=new DirectoryIteratorX(dirname(__FILE__));
$dir->nextFile();
$dir->current();
|
DirectoryIteratorクラスやSplFileInfoクラスはファイルに関する情報を扱うので、currentやnextといった基本以外のメソッドが大量に揃っています。
といっても作成、更新日時や読み書き属性等を拾ってくるようなメソッドばかりなので、触ってみればすぐにわかります。
手元のWindows環境では$dir->getPerms()で33206が返ってくるのですが、これは8進数にすると100666となり、パーミッション0666ということらしいです。
10は何?
PR
トラックバック
トラックバックURL: