Zipファイルの読み込みについてのサンプルがアドビのAIRのマニュアル(?)にあった。
ただし、このサンプルはHTMLに記述して使うもので、FlexのなかでActionScriptとしてのサンプルでなかったので、
それを参考にFlex & ActionScript用に書き直してみた。
といっても、クラスやらなんやらの名前(パッケージ名)が違う程度ですが。
AIRでZipファイルを簡単に解凍できるということをしって私にはとっても役にたちました。
これで、MS-Officeのファイル(2007以降のXML形式)はzipファイルですから・・・・、このファイルを簡単に操作できるようなものも作れるというわけです。
まあ、最初はファイルのメタ情報をとるような感じになるとおもいますが・・・・
後で本格的につくって、MS-Officeのファイルを操作しようかな・・・と野心が芽生えました・・・
というわけで、以下私がZipの動きをみるために書いたソースです。
zipファイルの指定は書き直してください。
import flash.utils.*;
import flash.filesystem.*;
private var stream:FileStream;
private var zfile:File;
private var h_signature:uint; // シグネチャ( 4バイト )
private var h_version:uint; // バージョン
private var h_compMethod:uint; // 圧縮方式 (2bytes)
private var h_filenameLength:uint;
private var h_xfieldLength:uint; // 拡張フィールドの長さ
public function unzip():void
{
zfile = File.desktopDirectory.resolvePath("ここにデスクトップにあるファイルを指定してください");
trace(zfile.nativePath);
stream = new FileStream();
stream.addEventListener(Event.COMPLETE, readBytes);
stream.addEventListener(IOErrorEvent.IO_ERROR,ioError);
stream.openAsync(zfile,FileMode.READ);
trace("unzip end");
}
private function readBytes(e:Event):void{
trace("FILE SIZE IS " + zfile.size);
trace("STR SIZE IS " + stream.bytesAvailable);
var bytes:ByteArray = new ByteArray();
stream.endian = Endian.LITTLE_ENDIAN;
bytes.endian = Endian.LITTLE_ENDIAN;
while(stream.position <zfile.size){
stream.readBytes(bytes,0,30);
bytes.position = 0;
h_signature = bytes.readInt();
if(h_signature != 0x04034b50){
trace("sig is " + h_signature);
break;
}
else{
trace("sig is OK : " + h_signature);
}
bytes.position = 4;
h_version = bytes.readByte();
trace("versioin is " + h_version);
bytes.position = 8;
h_compMethod = bytes.readByte();
trace("compmethod is " + h_compMethod);
// ファイル名の長さ
bytes.position = 26;
h_filenameLength = bytes.readShort();
// 拡張領域のサイズ
bytes.position = 28;
h_xfieldLength = bytes.readShort();
var offset:uint = h_filenameLength + h_xfieldLength;
stream.readBytes(bytes,30,offset);
// ファイル名を読み取る
bytes.position = 30;
var filename:String = bytes.readUTFBytes(h_filenameLength);
trace("filename is [" + filename + "]");
bytes.position = 18;
var compSize:uint = bytes.readUnsignedInt();
bytes.position = 22;
var uncompSize:uint = bytes.readUnsignedInt();
trace("org size is " + uncompSize);
if(uncompSize> 0 ){
stream.readBytes(bytes,0,compSize);
if(h_compMethod == 8 ){
bytes.uncompress(CompressionAlgorithm.DEFLATE);
// ここでbytesの中身を見ればOK
}
}
}
}
private function ioError(e:Event):void{
trace("IO Error " + e);
}

