忍者ブログ
[PR]
×

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



2024/03/19 11:34 |
PHP1-47:PHPで圧縮解凍

File_Archive 1.5.4 (stable)
http://pear.php.net/package/File_Archive

Linuxだったらexecやsystemで直接tar呼ぶのが手っ取り早いですが、Windowsだと当然使えません。
またBzip2やZlib等のライブラリで圧縮解凍を行うことが出来ますが、アーカイバ毎に個別のコマンドを使用する必要があり面倒です。
http://jp.php.net/manual/ja/refs.compression.php

そんな場合は例によって抽象化です。
File_Archiveは、読み込みや書き込みの際に、ファイル名の拡張子から勝手にアーカイバを識別して、それぞれに対応した方法で圧縮解凍を行ってくれます。
対応拡張子はtar、zip、jar、gz、tgz、tbz、bz2、bzi、ar、debと、Linuxで使用されるひととおりの拡張子に対応しています。
ただ例えばbz2はbzopenを呼んでいるだけだったりするので、一部の拡張子については各モジュールをインストールする必要があります。

またこのFile_Archive、使用法が少々特殊なので慣れないと面倒です。

file_archive.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
    require_once "File/Archive.php";
    
    //解凍
    //test.zip内にあるsample.txtを/tmpに解凍します
    File_Archive::extract(
          File_Archive::read('test.zip/sample.txt')
        , $dest='/tmp/'
    );
    
    //圧縮
    ///tmp/testフォルダの中身を全部/tmp/sample.zipに圧縮します
    File_Archive::extract(
          $src= '/tmp/test/'
        , File_Archive::toArchive(
              '/tmp/sample.zip'
            , File_Archive::toFiles()
        )
    );
    
    //アーカイブ形式変換
    //test.zipを読み出して、test.tgzとして保存しただけ
    File_Archive::extract(
          File_Archive::read('test.zip')
        , File_Archive::toArchive(
              'test.tgz'
            , File_Archive::toFiles()
        )
    );


基本的に何もかもをFile_Archive::extractの中で処理します。
引数はふたつで、基本は前者を後者に変換となります。
引数はFile_Archiveオブジェクト、もしくは変数で与えることができます。
extractの引数がextract(&$sourceToConvert, &$destToConvert, $autoClose = true, $bufferSize = 0)となっているため、上記のように$src=と変数で与えると大丈夫ですが、直接'test.zip'とか書くとエラーになります。

第二引数の指定方法ですが、toFilesを呼べば現在のファイル構造をそのままファイルとして保存します。
toArchiveを呼べばアーカイブを作成します。
toArchiveの場合はそのままではアーカイブ化するだけで出力を行わないので、さらに第二引数を指定します。
第二引数にtoFilesを呼べば作成したアーカイブを保存し、toOutputを呼ぶとブラウザからダウンロードさせることができます。


さてFile_Archiveにもイテレータのようなものが実装されています。
圧縮ファイル内のファイルをnextで取得してgetFilenameやgetStatで状態を取得できます。
まあcountは無いですしrewindはなんかうまく動いてないっぽいしで微妙ですが。

file_archive2.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
    require_once "File/Archive.php";
    
    //圧縮ファイルのイテレータ
    $source = File_Archive::read('sample.zip/');
    while($source->next()) {
        var_dump($source->getFilename(),$source->getStat());
    }
    
    //sample.zipから、1キロバイト以下のファイルを抜き出す
    File_Archive::extract(
        File_Archive::filter(
                File_Archive::predNot(
                    File_Archive::predMinSize(1024)
                ),
            File_Archive::read('sample.zip/')
        ),
        File_Archive::toArchive(
            'directory.zip',
            File_Archive::toFiles()
        )
    );


圧縮ファイルを作成する際、File_Archive::filterで任意のファイルを抜き出すことができます。
抜き出し方はわかりやすいので簡単にできるのですが、これもまた普通に&&とか書くことができず、
File_Archive::predAnd(File_Archive::predMinSize($size),File_Archive::predMinTime($time))
みたいな書き方をしないといけないため、入れ子だらけになります。
上のサンプルですら既に嫌になる状態ですが、マニュアルのサンプルはさらに凄いことになっています。
もうちょっとどうにかならなかったものでしょうか。
 

 

PR


2009/01/20 18:39 | Comments(0) | TrackBack() | PHP

トラックバック

トラックバックURL:

コメント

コメントを投稿する






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



<<PHP1-48:PHPで簡単ブログ | HOME | PHP1-46:PHPでPDFつづき>>
忍者ブログ[PR]