PHPスクリプトとPEARクラスでZIPファイルを作成する方法

13468 ワード

Webアプリケーションを開発する際には、CSVデータ、パスワードファイル、XMLコードの内容、および異なる形式のバイナリのデータなど、異なるフォーマットのファイルに遭遇する可能性があります.PHPスクリプトは、これらのファイルと頻繁に対話し、そこからデータを読み取り、データを書き込む必要があります.このようなフォーマットのファイルが処理されるため、PHPには名前が言えるほとんどのファイルフォーマットを接続し、使用するための内蔵関数と外部のライブラリが意外にも多くありません.
このガイドは、アプリケーション開発者がほとんど毎日このようなファイル:ZIPフォーマットに遭遇する可能性があるファイルフォーマットについてです.一般的に、このフォーマットは、電子メールとリモート接続でファイルを転送するために使用され、複数のファイルを1つのファイルに圧縮することができるため、ファイルのハードディスク(HDD)の占有スペースを低減し、移動を容易にすることができる.PHPはそのZZZipLibプラグインとPEARのArchive_を通じてZipクラスは、これらのZIPファイルを読み取り、作成することができます.
正常に動作しているApacheがあり、PHPがインストールされ、PEAR Archive_がインストールされていると仮定します.Zip classクラスは正しくインストールされています.
注意:PEAR Archiveを直接インターネットからインストールできます.Zipパッケージは、ダウンロードするか、提供された指示を利用することができます.
ZIPファイルの作成
簡単な例から始めましょう.いくつかの他のファイルを含むZIPファイルを動的に作成します.リストAのスクリプトで開始します.
リストA

 
   
  1. <?php 
  2. include ('Archive/Zip.php');        // imports 
  3.  
  4. $obj = new Archive_Zip('test.zip'); // name of zip file 
  5.  
  6. $files = array('mystuff/ad.gif'
  7.                'mystuff/alcon.doc'
  8.                'mystuff/alcon.xls');   // files to store 
  9.  
  10. if ($obj->create($files)) { 
  11.     echo 'Created successfully!'
  12. else { 
  13.     echo 'Error in file creation'
  14. ?>

このシナリオは非常に簡単ですが、よく見る価値があります.
まず、最初のステップはArchive_を作成することです.Zipクラスのインスタンスは、作成するアーカイブファイルのパスと名前で初期化されます.この例では、ファイルファイルはtestと命名される.zipは、現在のディレクトリの下にあります.
次に、圧縮するファイルをリストし、ハードディスク(HDD)の場所とともに保存する配列を初期化します.これらの場所は絶対的または相対的な用語で記載されていますが、スクリプトがファイルまたはディスクの場所に読み取り権限を持つことが重要です.
最後に、create()メソッドを使用して、指定したファイルを圧縮およびマージすることによって、アーカイブファイルを実際に構築します.このメソッドは、ファイルリストを入力として受け入れ、ブール論理値を返して、ファイルが正常に作成されたかどうかを示します.スクリプトは、ファイルが作成されたディレクトリの下に書き込み権限が必要であることに注意してください.そうしないと、create()メソッドは失敗します.これは普遍的で、ほとんどの初心者を失敗させた間違いです.
これで、ローカルシステム構成を反映するためにソースファイルのリストとターゲットファイルの場所を変更した後、上記のスクリプトを実行してみます.すべてがうまくいけば、Archive_Zipはリストを見つけてtestという名前に圧縮できるはずです.zipのZIPファイルのファイル.
ZIPファイルの内容を表示する
では、既存のZIPファイルの内容をどのように見るのでしょうか.Archive_Zip letsでは、listContent()メソッドでもこれを実行できます.次の例(リストB):
リストB

 
   
  1. <?php 
  2. include ('Archive/Zip.php');        // imports 
  3.  
  4. $obj = new Archive_Zip('test.zip'); // name of zip file 
  5.  
  6. $files = $obj->listContent();       // array of file information 
  7.  
  8. foreach ($files as $f) { 
  9.     foreach ($f as $k => $v) { 
  10.         echo "$k: $v
    "
  11.     } 
  12.     echo "
    "
  13. ?>

ListContent()の出力は、アーカイブファイル内の個別ファイルを表す配列からなる構造配列です.通常、各要素には、対応するファイルの名前、インデックスの場所、ステータス、サイズ(圧縮後および圧縮前)、および最近の変更時間など、関連する情報が保存されます.1サイクルでこれらの情報を容易に抽出することができ、リストBのようにフォーマットを再設定して、よりよく伝送することができる.出力の一例(リストC):
リストC

 
   
  1. filename: mystuff/alcon.xls 
  2. stored_filename: mystuff/alcon.xls 
  3. size: 113664 
  4. compressed_size: 35902 
  5. mtime: 1141996836 
  6. comment: 
  7. folder: 
  8. index: 0 
  9. status: ok  

既存のZIPファイルに新しいファイルを追加
  Archive_Zipクラスの興味深い特性は、add()メソッドで既存のアーカイブファイルに新しいファイルを追加できることです.この点を説明するためにtestに戻りましょう.zip、新しいファイルを追加しようとします(リストD):
リストD
 

 
   
  1. <?php 
  2. include ('Archive/Zip.php');        // imports 
  3.  
  4. if (file_exists('test.zip')) { 
  5.     $obj = new Archive_Zip('test.zip'); // name of zip file 
  6. else { 
  7.     die('File does not exist'); 
  8.  
  9. $files = array('otherstuff/montecarlo.png');   // additional files to store 
  10.  
  11. if ($obj->add($files)) { 
  12.     echo 'Added successfully!'
  13. else { 
  14.     echo 'Error in file addition'
  15. ?> 

ご覧のように、既存のファイルに新しいファイルを追加するプログラムは、新しいファイルを作成するプログラムとよく似ています.新しいArchive_を初期化します.Zipオブジェクトは疑問符で表されるアーカイブファイルを指し、追加するファイルを表す配列のリストを作成し、この配列をadd()メソッドに入力します.create()メソッドと同様にadd()は、追加が成功したかどうかを示すブール論理信号を返す.前と同様に、スクリプトにソースファイルを読み込む適切な権限があることを確認し、新しい圧縮されたファイルをハードディスク(HDD)に書き込むことを忘れないでください.
既存のZIPファイルからファイルを削除
ファイルを追加するのと同様に、ファイルを削除することもできます.Archive_Zipクラスにはdelete()メソッドがあり、既存のアーカイブファイルからファイルを削除できます.リストEはこの点を説明する.
リストE
 

 
   
  1. <?php 
  2. include ('Archive/Zip.php');        // imports 
  3.  
  4. if (file_exists('test.zip')) { 
  5.     $obj = new Archive_Zip('test.zip'); // name of zip file 
  6. else { 
  7.     die('File does not exist'); 
  8.  
  9. $files = array('mystuff/ad.gif''otherstuff/montecarlo.png');   // files to delete 
  10.  
  11. if ($obj->delete(array('by_name' => $files))) { 
  12.     echo 'Deleted successfully!'
  13. else { 
  14.     echo 'Error in file deletion';      
  15. ?> 

ここでは、削除するファイルの配列を作成し、delete()メソッドに入力します.注意delete()呼び出しの特殊パラメータ「by_name」:Archive_Zipは、ファイル名と正確に一致するファイルのみを削除します.削除に成功した場合、delete()メソッドは真を返します.
この形式の選択的な削除に加えて、delete()メソッドは、特定のタイプまたは正規表現と一致するファイルの大規模な破壊をサポートします.PerlとPHPの正規表現は、「by_ereg」または「by_preg」パラメータを使用してサポートされています.リストFは、Perlの正規表現を用いる1つのファイル内のすべての*を削除する方法を説明するための例である.docファイル.
リストF
 

 
   
  1. <?php 
  2. include ('Archive/Zip.php');        // imports 
  3.  
  4. if (file_exists('test.zip')) { 
  5.     $obj = new Archive_Zip('test.zip'); // name of zip file 
  6. else { 
  7.     die('File does not exist'); 
  8.  
  9. if ($obj->delete(array('by_preg' => "/.*doc$/"))) { // all DOC files 
  10.     echo 'Deleted successfully!'
  11. else { 
  12.     echo 'Error in file deletion';     
  13. ?> 

以上の例のように、PEARのArchive_Zipクラスは用途が多く、数行のコードだけで、かなり複雑なZIPファイルとのインタラクションを実行できます.上記のスクリプトの例が、日常的な開発活動でこのクラスをどのように使用するかを教え、実験に興味を持つようにインスピレーションを与えることを願っています.プログラミングを楽しんでください