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);
}

関連記事

Leave a Reply

Spam protection by WP Captcha-Free

RSS
Add to Google

カスタム検索
ソフトウェア&ライブラリ


ライブラリ
airxmail(en)
AIR版メール送受信ライブラリ
airxzip
AIR版ZIP圧縮・解凍ライブラリ
カレンダー
2009年7月
« 6月   8月 »
 12345
6789101112
13141516171819
20212223242526
2728293031  
アーカイブ
カテゴリ
にほんブログ村 IT技術ブログへ