忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2017/10/19 01:36 |
PHP1-39:ディレクトリでイテレータ

配列に対するイテレータ、オブジェクトに対するイテレータと来て次はディレクトリに対するイテレータを使ってみます。
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
<?php
    
    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


2008/12/11 23:09 | Comments(0) | TrackBack(0) | PHP

トラックバック

トラックバックURL:

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<PHP1-40:PHPでXML | HOME | PHP1-38:オブジェクトでイテレータ>>
忍者ブログ[PR]