Forum und email

Zip ファイル関数

導入

この拡張モジュールにより、ZIP 圧縮されたアーカイブとその内部のファイルに対する透過的な読み書きが可能となります。

要件

PHP 4

PHP 4 に同梱されているバージョンは、Guido Draheim 氏による » ZZIPlib バージョン 0.10.6 以降を必要とします。

PHP 5.2.0 以降

この拡張モジュールは、Jean-loup Gailly 氏と Mark Adler 氏による » zlib の機能を利用します。

インストール手順

PHP 4

注意: PHP 4.1.0 以前の Zip サポートは実験的なものです。

警告

PHP 4 の zip 拡張モジュールはメンテナンスされていませんので、 私たちはバンドルされているものよりも PECL 拡張モジュールの利用を推奨します。

Linux システム

これらの関数を使用するには、zip サポートを有効にして PHP をコンパイルしなければなりません。そのためには、設定オプション --with-zip[=DIR] を使用します。 [DIR] は、» ZZIPlib ライブラリのインストールされている場所です。

Windows

Windows ユーザは、これらの関数を使用するために php.ini 内の php_zip.dll を有効にする必要があります。

PHP 5.2.0 以降

Linux systems

これらの関数を利用するには、設定オプション --enable-zip を使用して zip サポートを有効にして PHP をコンパイルしなければなりません。

Windows

Windows ユーザは、これらの関数を使用するために php.ini 内の php_zip.dll を有効にする必要があります。

PECL 経由でのインストール

この PECL 拡張モジュールをインストールする方法は、 マニュアルの PECL 拡張モジュールのインストール という章にあります。 新規リリース・ダウンロード・ソースファイル・管理者情報・CHANGELOG といった関連する情報については、次の場所にあります。 » https://pecl.php.net/package/zip.

この PECL 拡張モジュール用の DLL は、» PHP のダウンロード ページあるいは » https://pecl4win.php.net/ からダウンロードできます。

PHP 4 の場合、この DLL は PHP の Windows ダウンロードバイナリの extensions/ ディレクトリ にあります。

実行時設定

設定ディレクティブは定義されていません。

リソース型

Zip モジュールでは二種類のリソース型が使用されます。 まず最初が Zip アーカイブを表す Zip directory で、 もうひとつはアーカイブのエントリを表す Zip Entry です。

定義済み定数

以下の定数が定義されています。 この関数の拡張モジュールが PHP 組み込みでコンパイルされているか、 実行時に動的にロードされている場合のみ使用可能です。

ZipArchive はクラス定数を使用します。定数には フラグ (FL_)、エラー (ER_) あるいはモード (接頭辞なし) の三種類があります。

ZIPARCHIVE::CREATE (integer)
アーカイブが存在しない場合に、作成します。
ZIPARCHIVE::OVERWRITE (integer)
常に新しいアーカイブを開始します。このモードは、 ファイルが既に存在する場合にはそれを上書きします。
ZIPARCHIVE::EXCL (integer)
アーカイブが既に存在する場合はエラーとします。
ZIPARCHIVE::CHECKCONS (integer)
アーカイブの一貫性チェックを別途行い、 失敗した場合はエラーとします。
ZIPARCHIVE::FL_NOCASE (integer)
名前で検索する際に大文字小文字を区別しません。
ZIPARCHIVE::FL_NODIR (integer)
ディレクトリ要素を無視します。
ZIPARCHIVE::FL_COMPRESSED (integer)
圧縮されたデータを読み込みます。
ZIPARCHIVE::FL_UNCHANGED (integer)
元のデータを使用し、変更内容を無視します。
ZIPARCHIVE::CM_DEFAULT (integer)
圧縮あるいは保存のどちらか有効なほうを実行します。
ZIPARCHIVE::CM_STORE (integer)
保存します (圧縮しません)。
ZIPARCHIVE::CM_SHRINK (integer)
圧縮します。
ZIPARCHIVE::CM_REDUCE_1 (integer)
reduced with factor 1
ZIPARCHIVE::CM_REDUCE_2 (integer)
reduced with factor 2
ZIPARCHIVE::CM_REDUCE_3 (integer)
reduced with factor 3
ZIPARCHIVE::CM_REDUCE_4 (integer)
reduced with factor 4
ZIPARCHIVE::CM_IMPLODE (integer)
imploded
ZIPARCHIVE::CM_DEFLATE (integer)
deflated
ZIPARCHIVE::CM_DEFLATE64 (integer)
deflate64
ZIPARCHIVE::CM_PKWARE_IMPLODE (integer)
PKWARE 方式。
ZIPARCHIVE::CM_BZIP2 (integer)
BZIP2 アルゴリズム。
ZIPARCHIVE::ER_OK (integer)
エラーはありません。
ZIPARCHIVE::ER_MULTIDISK (integer)
複数ディスクの zip アーカイブはサポートされません。
ZIPARCHIVE::ER_RENAME (integer)
一時ファイルの名前変更に失敗しました。
ZIPARCHIVE::ER_CLOSE (integer)
zip アーカイブのクローズに失敗しました。
ZIPARCHIVE::ER_SEEK (integer)
シークエラー。
ZIPARCHIVE::ER_READ (integer)
読み込みエラー。
ZIPARCHIVE::ER_WRITE (integer)
書き込みエラー。
ZIPARCHIVE::ER_CRC (integer)
CRC エラー。
ZIPARCHIVE::ER_ZIPCLOSED (integer)
zip アーカイブはクローズされました。
ZIPARCHIVE::ER_NOENT (integer)
そのファイルはありません。
ZIPARCHIVE::ER_EXISTS (integer)
ファイルが既に存在します。
ZIPARCHIVE::ER_OPEN (integer)
ファイルをオープンできません。
ZIPARCHIVE::ER_TMPOPEN (integer)
一時ファイルの作成に失敗しました。
ZIPARCHIVE::ER_ZLIB (integer)
Zlib エラー。
ZIPARCHIVE::ER_MEMORY (integer)
メモリの確保に失敗しました。
ZIPARCHIVE::ER_CHANGED (string)
エントリが変更されました。
ZIPARCHIVE::ER_COMPNOTSUPP (integer)
圧縮方式がサポートされていません。
ZIPARCHIVE::ER_EOF (integer)
予期せぬ EOF です。
ZIPARCHIVE::ER_INVAL (integer)
無効な引数です。
ZIPARCHIVE::ER_NOZIP (integer)
zip アーカイブではありません。
ZIPARCHIVE::ER_INTERNAL (integer)
内部エラー。
ZIPARCHIVE::ER_INCONS (integer)
矛盾した Zip アーカイブです。
ZIPARCHIVE::ER_REMOVE (integer)
ファイルを削除できません。
ZIPARCHIVE::ER_DELETED (integer)
エントリが削除されました。

Example#1 Zip アーカイブの作成

<?php

$zip 
= new ZipArchive();
$filename "./test112.zip";

if (
$zip->open($filenameZIPARCHIVE::CREATE)!==TRUE) {
    exit(
"cannot open <$filename>\n");
}

$zip->addFromString("testfilephp.txt" time(), "#1 This is a test string added as testfilephp.txt.\n");
$zip->addFromString("testfilephp2.txt" time(), "#2 This is a test string added as testfilephp2.txt.\n");
$zip->addFile($thisdir "/too.php","/testfromfile.php");
echo 
"numfiles: " $zip->numFiles "\n";
echo 
"status:" $zip->status "\n";
$zip->close();
?>

Example#2 アーカイブの詳細の出力および一覧表示

<?php
$za 
= new ZipArchive();

$za->open('test_with_comment.zip');
print_r($za);
var_dump($za);
echo 
"numFiles: " $za->numFiles "\n";
echo 
"status: " $za->status  "\n";
echo 
"statusSys: " $za->statusSys "\n";
echo 
"filename: " $za->filename "\n";
echo 
"comment: " $za->comment "\n";

for (
$i=0$i<$za->numFiles;$i++) {
    echo 
"index: $i\n";
    
print_r($za->statIndex($i));
}
echo 
"numFile:" $za->numFiles "\n";
?>

Example#3 Zip ストリームラッパーによる OpenOffice メタ情報の読み込み

<?php
$reader 
= new XMLReader();

$reader->open('zip://' dirname(__FILE__) . '/test.odt#meta.xml');
$odt_meta = array();
while (
$reader->read()) {
    if (
$reader->nodeType == XMLREADER::ELEMENT) {
        
$elm $reader->name;
    } else {
        if (
$reader->nodeType == XMLREADER::END_ELEMENT && $reader->name == 'office:meta') {
            break;
        }
        if (!
trim($reader->value)) {
            continue;
        }
        
$odt_meta[$elm] = $reader->value;
    }
}
print_r($odt_meta);
?>

この例は旧 API (PHP 4 用) を使用します。まず ZIP ファイルアーカイブをオープンし、アーカイブ内の各ファイルを読み込み、 その内容を出力します。この例で使用するアーカイブ test2.zip は、ZZIPlib のソース配布物に含まれているテスト用アーカイブのひとつです。

Example#4 Zip の使用例

<?php

$zip 
zip_open("/tmp/test2.zip");

if (
$zip) {
    while (
$zip_entry zip_read($zip)) {
        echo 
"Name:               " zip_entry_name($zip_entry) . "\n";
        echo 
"Actual Filesize:    " zip_entry_filesize($zip_entry) . "\n";
        echo 
"Compressed Size:    " zip_entry_compressedsize($zip_entry) . "\n";
        echo 
"Compression Method: " zip_entry_compressionmethod($zip_entry) . "\n";

        if (
zip_entry_open($zip$zip_entry"r")) {
            echo 
"File Contents:\n";
            
$buf zip_entry_read($zip_entryzip_entry_filesize($zip_entry));
            echo 
"$buf\n";

            
zip_entry_close($zip_entry);
        }
        echo 
"\n";

    }

    
zip_close($zip);

}
?>

目次