Join MDN and developers like you at Mozilla's View Source conference, 12-14 September in Berlin, Germany. Learn more at https://viewsourceconf.org

nsIZipWriter

nsIZipWriter インタフェースは、スクリプトを使ってデータを Zip ファイル形式にアーカイブできる簡単な方法を提供します。アーカイブに対する操作はひとつずつ実行することも、キューに入れておいて後で実行することもできます。

実行したい操作をすべてキューに追加したら、processQueue() を呼び出せば、キューに追加した順番通りに操作が実行されます。キューの途中で実行された操作は、オブザーバの対象外で発生したエラーもすべて例外として投げます。

バックグラウンドでキューを実行中に、インタフェースに対して同時に操作を行おうとした場合、NS_ERROR_IN_PROGRESS という例外が投げられます。

ファイル名やディレクトリ名の区切り記号には必ずスラッシュ ("/") を使い、また 1 文字目がスラッシュで始まっていてはいけません。

註: ディレクトリ内のファイルエントリを追加するために、そのディレクトリのエントリを追加しておく必要はありませんが、一部の Zip ユーティリティでは問題が生じる可能性がありますので、あらかじめディレクトリエントリを明示的に追加しておいた方が良いでしょう。


Please add a summary to this article.
  最終更新: Gecko 1.9 (Firefox 3)

継承元: nsISupports

実装: @mozilla.org/zipwriter;1. インスタンスを作成するには、以下のように記述します。

var zipWriter = Components.classes["@mozilla.org/zipwriter;1"]
                          .createInstance(Components.interfaces.nsIZipWriter);

メソッドの概要

void addEntryDirectory(in AUTF8String aZipEntry, in PRTime aModTime, in boolean aQueue);
void addEntryChannel(in AUTF8SZtring aZipEntry, in PRTime aModTime, in PRInt32 aCompression, in nsIChannel aChannel, in boolean aQueue)
void addEntryFile(in AUTF8SZtring aZipEntry, in PRInt32 aCompression, in nsIFile aFile, in boolean aQueue)
void addEntryStream(in AUTF8SZtring aZipEntry, in PRTime aModTime, in PRInt32 aCompression, in nsIInputStream aStream, in boolean aQueue)
void close()
nsIZipEntry getEntry(in AUTF8String aZipEntry);
boolean hasEntry(in AUTF8String aZipEntry);
void open(in nsIFile aFile, in PRInt32 aIoFlags);
void processQueue(in nsIRequestObserver aObserver, in nsISupports aContext)
void removeEntry(in AUTF8String aZipEntry, in boolean aQueue)

属性

属性 説明
comment ACString 開かれている Zip ファイルに関連付けられているコメントを取得あるいは設定します。開かれている Zip ファイルがない場合は、例外 NS_ERROR_NOT_INITIALIZED が投げられます。
inQueue boolean バックグラウンドのキューで操作が実行中の場合は true、バックグラウンド操作が実行中でない場合は false読み取り専用。
file nsIFile 書き込みを行う Zip ファイル。読み取り専用。

定数

定数 説明
COMPRESSION_NONE 0 ファイルを圧縮しない。
COMPRESSION_FASTEST 1 ファイルをアーカイブに追加する際、最速の圧縮方法を使用します。
COMPRESSION_DEFAULT 6 ファイルをアーカイブに追加する際、標準の圧縮方法を使用します。
COMPRESSION_BEST 9 ファイルをアーカイブに追加する際、最も圧縮率の高い圧縮方法を使用します。

メソッド

addEntryDirectory()

Zip ファイルに新しいディレクトリエントリを追加します。

註: ディレクトリ内のファイルエントリを追加するために、そのディレクトリのエントリを追加しておく必要はありませんが、一部の Zip ユーティリティでは問題が生じる可能性がありますので、あらかじめディレクトリエントリを明示的に追加しておいた方が良いでしょう。

 void addEntryDirectory(
   in AUTF8String aZipEntry,
   in PRTime aModTime,
   in boolean aQueue
 );
引数
aZipEntry
Zip ファイルに追加するディレクトリエントリのパス。
aModTime
エントリの変更日時。ミリ秒単位。
aQueue
操作をキューに追加して後で実行する場合は true、操作を即座に実行する場合は false
投げられる例外
NS_ERROR_NOT_INITIALIZED
開かれている Zip ファイルがありません。
NS_ERROR_FILE_ALREADY_EXISTS
指定されたパスは既に Zip ファイルの中に存在します。
NS_ERROR_IN_PROGRESS
Zip Writer は他の操作を実行中です。

addEntryChannel()

チャンネルから Zip ファイルにデータを追加します。

 void addEntryChannel(
   in AUTF8String aZipEntry,
   in PRTime aModTime,
   in PRInt32 aCompression,
   in nsIChannel aChannel,
   in boolean aQueue
 );
引数
aZipEntry
Zip ファイルに追加するファイルエントリのパス。これは Zip ファイル内に配置されるパスになります。
aModTime
エントリの変更日時。ミリ秒単位。
aCompression
使用する圧縮方法を表す 圧縮定数 のいずれか。
aChannel
データを取得するチャンネル。
aQueue
操作をキューに追加して後で実行する場合は true、操作を即座に実行する場合は false
投げられる例外
NS_ERROR_NOT_INITIALIZED
開かれている Zip ファイルがありません。
NS_ERROR_FILE_ALREADY_EXISTS
指定されたパスは既に Zip ファイルの中に存在します。
NS_ERROR_IN_PROGRESS
Zip Writer は他の操作を実行中です。

addEntryFile()

新しいファイルもしくはディレクトリを Zip ファイルに追加します。指定されたファイルがディレクトリの場合、この呼び出しは以下と同じことになります。

 addEntryDirectory(aZipEntry, aFile.lastModifiedTime, aQueue);
 void addEntryFile(
   in AUTF8String aZipEntry,
   in PRInt32 aCompression,
   in nsIFile aFile,
   in boolean aQueue
 );
引数
aZipEntry
Zip ファイルに追加するファイルエントリのパス。これは Zip ファイル内に配置されるパスになります。
aCompression
使用する圧縮方法を表す 圧縮定数 のいずれか。
aFile
データと変更日時を取得するファイル。
aQueue
操作をキューに追加して後で実行する場合は true、操作を即座に実行する場合は false
投げられる例外
NS_ERROR_NOT_INITIALIZED
開かれている Zip ファイルがありません。
NS_ERROR_FILE_ALREADY_EXISTS
指定されたパスは既に Zip ファイルの中に存在します。
NS_ERROR_IN_PROGRESS
Zip Writer は他の操作を実行中です。

addEntryStream()

入力ストリームから Zip ファイルにデータを追加します。

 void addEntryStream(
   in AUTF8String aZipEntry,
   in PRTime aModTime,
   in PRInt32 aCompression,
   in nsIInputStream aStream,
   in boolean aQueue
 );
引数
aZipEntry
Zip ファイルに追加するファイルエントリのパス。これは Zip ファイル内に配置されるパスになります。
aModTime
エントリの変更日時。ミリ秒単位。
aCompression
使用する圧縮方法を表す 圧縮定数 のいずれか。
aStream
データを取得する入力ストリーム。
aQueue
操作をキューに追加して後で実行する場合は true、操作を即座に実行する場合は false
投げられる例外
NS_ERROR_NOT_INITIALIZED
開かれている Zip ファイルがありません。
NS_ERROR_FILE_ALREADY_EXISTS
指定されたパスは既に Zip ファイルの中に存在します。
NS_ERROR_IN_PROGRESS
Zip Writer は他の操作を実行中です。

close()

Zip ファイルを閉じます。

 void close();
引数

なし。

投げられる例外
NS_ERROR_NOT_INITIALIZED
開かれている Zip ファイルがありません。
NS_ERROR_IN_PROGRESS
Zip Writer は他の操作を実行中です。

Zip ファイルの仕上げが失敗した場合、他の例外が投げられる場合もあります。

getEntry()

開かれている Zip ファイルから特定のエントリを取得します。

 nsIZipEntry getEntry(
   in AUTF8String aZipEntry,
 );
引数
aZipEntry
取得するファイルエントリのパス。
戻り値

指定したエントリについて説明した nsIZipEntry オブジェクト。あるいは、該当するエントリが存在しなかった場合 null

hasEntry()

特定のエントリが Zip ファイル内に存在するかどうかを判別します。

 boolean hasEntry(
   in AUTF8String aZipEntry,
 );
引数
aZipEntry
確認を行うファイルエントリのパス。
戻り値

指定されたパスのエントリが Zip ファイル内に存在する場合は true、存在しない場合は false を返します。

open()

指定された Zip ファイルを開きます。

 void open(
   in nsIFile aFile,
   in PRInt32 aIoFlags
 );
引数
aFile
開く Zip ファイル。
aIoFlags
prio.h で指定された、Zip ファイルのオープンフラグ。
投げられる例外
NS_ERROR_ALREADY_INITIALIZED
Zip ファイルは既に開かれています。
NS_ERROR_INVALID_ARG
aFile 引数が null です。
NS_ERROR_FILE_NOT_FOUND
指定されたファイルが見つからず、フラグでそのファイルの作成が許可されていません。または、指定されたファイルを含むディレクトリが存在しません。
NS_ERROR_FILE_CORRUPTED
指定されたファイルは識別可能な Zip ファイルではありません。

ファイルが破損していた場合やサポートされていない形式だった場合など、ファイルを開くのに失敗すると、他の例外が投げられる場合もあります。

processQueue()

キュー全体の処理が完了するかエラーが発生するまで、キューに追加されたすべての項目を処理します。最初の操作が開始されたときと、最後の操作が完了したときに、オブザーバに通知が行われます。

エラーが発生した場合はすべてオブザーバに通知されます。

キューが完了するか、エラーが起きて途中までのキューの処理が中止されるまで、Zip Writer はビジー状態になります。途中までの処理に失敗した場合、残りの項目はキューに留まります。再度 processQueue() を呼び出すと、操作が中断されたところから再開されます。

 void processQueue(
   in nsIRequestObserver aObserver,
   in nsISupports aContext
 );
引数
aObserver
キューから通知を受け取るオブザーバ。
aContext
オブザーバに渡すコンテキスト。
投げられる例外
NS_ERROR_NOT_INITIALIZED
開かれている Zip ファイルがありません。
NS_ERROR_IN_PROGRESS
キューの処理は既に実行中です。

removeEntry()

Zip ファイルからエントリを削除します。

 void removeEntry(
   in AUTF8String aZipEntry,
   in boolean aQueue
 );
引数
aZipEntry
Zip ファイルから削除するエントリのパス。
aQueue
削除の操作をキューに追加する場合は true。即座に実行する場合は false
投げられる例外
NS_ERROR_NOT_INITIALIZED
開かれている Zip ファイルがありません。
NS_ERROR_IN_PROGRESS
キューの処理は既に実行中です。
NS_ERROR_FILE_NOT_FOUND
指定されたパスにエントリが存在しません。

Zip ファイルの更新に失敗した場合、他の例外が投げられる場合もあります。

コメントを Zip ファイルに追加する

var zipWriter = Components.Constructor("@mozilla.org/zipwriter;1", "nsIZipWriter");
var zipW = new zipWriter();

zipW.open(myZipFilePath, PR_RDWR | PR_CREATE_FILE | PR_TRUNCATE);
zipW.comment = "This is a comment.";
zipW.close();

PR_RDWR とそれに続くオプションは、どのインタフェースにも含まれていない定数です (Bug 433295 参照)。このため、上記のコードを実際に動作させるには、以下のようなコードを追加する必要があります。

const PR_RDONLY      = 0x01;
const PR_WRONLY      = 0x02;
const PR_RDWR        = 0x04;
const PR_CREATE_FILE = 0x08;
const PR_APPEND      = 0x10;
const PR_TRUNCATE    = 0x20;
const PR_SYNC        = 0x40;
const PR_EXCL        = 0x80;

I/O Snippets も参照してください。

ファイルを Zip アーカイブに追加する

このコードは、nsIFile theFile で指定されたファイルを、Zip アーカイブへ同期的に追加するものです。

var zipWriter = Components.Constructor("@mozilla.org/zipwriter;1", "nsIZipWriter");
var zipW = new zipWriter();

zipW.open(myZipFilePath, PR_RDWR | PR_CREATE_FILE | PR_TRUNCATE);
zipW.addEntryFile("Path/For/This/File/In/Zip Archive", Components.interfaces.nsIZipWriter.COMPRESSION_DEFAULT, theFile, false);
zipW.close();

引数のうち nyZipFilePath は、実際にはパスではなく、新しい Zip ファイルの場所を指定する nsIFile インスタンスのことを指しています。ファイルそのものは存在していなくても構いませんが、そのファイルを含むディレクトリ (つまり nsIFile.parent) は必ず存在している必要があります。

その他の例

他の例については、ソースツリー内のユニットテストを参照してください。

関連記事

ドキュメントのタグと貢献者

 このページの貢献者: teoli, Kohei
 最終更新者: teoli,