zipの解凍は ByteArray.uncompress を使えばできるんですが、zipの中にサブフォルダまであると解凍して保存する仕方が探してもよくわかりません。
調べたところ『Fzip』というライブラリがありそれではできそうだったのですが、これもまたサブフォルダを解凍してくれませんでした。
悩んだ結果、アプリからコマンドラインを実行させて解凍すればいけるんじゃね?と考え実際にやってみました!
1. 7-Zipのダウンロード
『 圧縮・解凍ソフト7-Zip』のコマンドラインバージョンをダウンロードし、アプリフォルダ直下にunzipフォルダを作成しその中にまるごと入れます。その作業で7-Zipのexeは appfolder/unzip/7za.exe にあるはずです。
2. batファイルの作成
コマンドラインからbatファイルを実行させたいのでunzip.batファイルをunzipフォルダに作成します。batファイルの内容は以下です。
1 |
.\unzip\7za.exe x test.zip -y |
パスについてはAIRアプリから見てのパスになります。ですのでこの場合test.zipはAIRアプリと同じ階層にある事になります。 x は解凍するときにつけます。 -y は解凍する際に同じファイル名があった場合上書きをするを意味しています。その他オプションはコマンドプロンプトで7za.exeを実行すると確認できます。
3. AIRのコード
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 |
function ZipUncompress( _file:File ){ var info:NativeProcessStartupInfo = new NativeProcessStartupInfo(); // コマンドプロンプト実行 var file:File = new File("C:\\Windows\\System32\\cmd.exe"); info.executable = file; // test.batを実行するコマンドラインを引数に設定 var arg:Vector.<String> = new Vector.<String>(); arg.push("/c"); arg.push(".\\unzip\\unzip.bat"); info.arguments = processArgs; var process:NativeProcess = new NativeProcess(); process.addEventListener(ProgressEvent.STANDARD_OUTPUT_DATA, OutputDataHandler); process.addEventListener(ProgressEvent.STANDARD_ERROR_DATA,ErrorDataHandler); process.start(info); function OutputDataHandler(event:ProgressEvent){ var standardOutput:IDataInput = process.standardOutput; var output:String = standardOutput.readMultiByte(e.bytesLoaded,"utf-8"); if(output.indexOf("Everything is Ok") != -1){ // 解凍完了 // この後何か処理 } } function ErrorDataHandler(event:ProgressEvent){ trace("error"); } } |
7za.exeをコマンドプロンプトで実行させると分かるんですがメッセージを出力させながら解答していくため OutputDataHandler は何回か実行されます。
解凍が終了すると『Everything is Ok』の文字がコマンドプロンプトで表示されるためその表示をAIR側で取得したら解凍完了と判断しています。
コメントを残す