忍者ブログ
[PR]
×

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



2024/03/29 08:57 |
PHP5.3.5 PharDataクラスを使ってみる
前回の続き?

PharDataクラスは、Pharをextendsしているのでpharの関連機能かと思いきや、実はphar全く関係なしに使うことができる圧縮ファイル操作クラスで、どっちかというとZipArchiveの仲間です。
またPharのようにphp.iniを設定することなく使用することができます。

とりあえず適当なzipファイルに対して使用してみます。
<?php
	//コンストラクタ
		$pharData = new PharData('hoge.zip', 
			FilesystemIterator::CURRENT_AS_FILEINFO | FilesystemIterator::KEY_AS_FILENAME
		);
	
	//zip内のファイルを順に辿る
	foreach($pharData as $key=>$val){
		//FilesystemIterator::KEY_AS_FILENAMEを指定しているので$keyはファイル名になる
		print($key);
		//FilesystemIterator::CURRENT_AS_FILEINFOを指定しているので$valはPharFileInfoクラスになる
		print(get_class($val));
	}
	
	//zipにファイル追加
		$pharData->addFile('mushroom.gif');
		$pharData->addFile('mushroom.gif', 'mushroom2.gif');
	
	//zipのファイル削除
		$pharData->delete('mushroom.gif');
		unlink('phar://hoge.zip/mushroom2.gif');
PharDataのコンストラクタの例にはCURRENT_AS_FILEINFOとかKEY_AS_FILENAMEとかいう謎の定数が書かれているのですが、これらは実際には定義されていません。

PharData extends Phar extends RecursiveDirectoryIterator extends FilesystemIteratorとなっており、FilesystemIterator::CURRENT_AS_FILEINFOとかFilesystemIterator::KEY_AS_FILENAMEとかのクラス定数が定義されているのでこれらを設定することができます。
http://www.php.net/manual/ja/class.filesystemiterator.php#filesystemiterator.constants

あとはPharData::addFile()で圧縮ファイルを解凍せずにファイルを追加したり、PharData::delete()で削除したりといった操作を簡単に行うことができます。


ちなみにforeachとかに使うインデックスはオブジェクト作成時に作成したらそのままらしく、addFile()後にループしても出てきません。
それはまだいいのですがdelete()後にforeachするとFatal errorになります。
Fatal error: Uncaught exception 'RuntimeException' with message 'Cannot access phar file entry '/hoge.gif' in archive 'C:/hoge.zip''

まあ正直素直にZipArchive使っておけば、という気がしないでもない。
PR


2011/08/01 23:21 | Comments(0) | TrackBack() | PHP

トラックバック

トラックバックURL:

コメント

コメントを投稿する






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



<<Mantis1.2.5 Mantisのインストールでどん詰まった | HOME | 買ったものリスト 2011/07/31>>
忍者ブログ[PR]