Archive for 8月, 2009
前回、zipの展開方法を記述しましたので、今度は圧縮方法です。
例の如く、実際の圧縮には ByteArray.compress() を用いています。
基本的に、動作の確認はWindowsでしかやっておりません。
ただし、作成したzipファイルがLinuxでのunzipコマンドで展開できることは確認しております。
Zipの圧縮方法
[AS]
import com.coltware.commons.zip.*;
import flash.filesystem.*;
public function zip():void{
zipWriter = new ZipFileWriter();
zfile = File.desktopDirectory.resolvePath(“sample.zip”);
var file1:File = File.desktopDirectory.resolvePath(“sample.doc”);
zipWriter.addFile(file1,”sample.doc”);
// 空のディレクトリを追加する場合には、以下のようにする
// 空でない場合は、直接下のファイルのようにしてしまえば問題ありません。
zipWriter.addDirectory(“フォルダ1″);
var file2:File = File.desktopDirectory.resolvePath(“sample1.doc”);
zipWriter.addFile(file2,”フォルダ2/読んでください.doc”);
// これを忘れないでください。ファイルとしては作成されますが、
// ここで最後の情報を記述していますので、
// おかしなファイルになってしまいます。
zipWriter.close();
}
[/AS]
また、パスのセパレータ( “/”ってやつ)は、OSに関係なく”/”にしてください。
これは、Zipフォーマットのルールですが。
また、ファイルの先頭に”/”をつけないでください。
Windowsでは見えなくなります。(linux unzipの場合にはワーニングがでて無視されるようです。)
Linux用にZipファイルを作成したい場合
[AS]
zipWriter = new ZipFileWriter(ZipFileWriter.HOST_UNIX);
//
// デフォルトは ZipFileWriter.HOST_WIN です。
//
[/AS]
のようにしてください。
これで、日本語ファイル名がUTF-8になります。
また、ファイルのパーミッションを設定したい場合には、
[AS]
// ディレクトリのモード(空のディレクトリを追加した場合)
zipWriter.setDirMode(“0777″);
// ファイルのモード
zipWriter.setFileMode(“0777″);
[/AS]
のように設定してください。
ここは文字列の8進数で設定してください。
設定後、すべてこのパーミッションが適用されます。
ファイルからではなくByteArrayデータから登録したい
[AS]
public function addBytes(data:ByteArray,filename:String,bytes:ByteArray,date:Date = null):void
[/AS]
というメソッドがありますので、こちらを利用ください。
実際にaddFileも、この関数を使っています。
date は、最終変更日時ですが、何も入れなければ”今”の時間が入ります。
これを書いていて、Zipの展開には非同期処理があるのですが、圧縮には非同期処理をつけ忘れたことに気が付きました。
Fzipとの違い
- 日本語ファイルの対応
MACでZipしたファイルをWinで解凍すると文字化けするという問題の対応などもしてあります。
日本語環境で、Windowsで作られたと思われるZipファイルはSJIS, それ以外はUTF-8がファイル名の文字コードになります。
ただし、書き込み時には作成されるホストOSを選ぶようにします。
文字コード以外にも、考慮する部分が出てきますので・・・ - 読み込み時に情報レコードから先に読み大きなファイルでも少ない時間で情報を取得
ファイルを最後から読んでいます。
まあ、このあたりはAIRだからこそできるわけですが・・・・
ActionScriptってファイルの読み込みが遅いんですよね。 - ファイルの属性対応
いわゆる、そのファイルがディレクトリか、ファイルかなど。また、UNIX系の場合にはパーミッションなど。
このあたりが設定されていないと、うまく解凍できないものもありますので・・・ - 非同期対応
解凍していると、固まってしまうのですがこれを回避しています。
ただし、圧縮ではありません。(ただ忘れただけですので作ります)
ダウンロードは前回の記事を見てください。



