##経緯
- Flash でオーサリングし、Adobe AIR for Desktop で Windows 向けのデスクトップアプリを「ランタイムが埋め込まれたアプリケーション」で書き出して制作していた。
- 書き出したアプリは、ローカルにおいてもLAN上においても動作は問題なかったが、それをCDに焼くと、URLLoader で読み込んでいる外部ファイルがIOエラーで読み込みに失敗する。swf でも txt でも変わらずエラー。
- AIR のランタイムバージョンを変更したり、細かい設定変えてみたけれど変わらず。
##対応
本体のアプリと別に、ドキュメント(マイドキュメント)フォルダーにデータをコピーしてからそれをキックするアプリをつくった
##コード
Flash のタイムラインにコードを書いています。Flex や Flash Builder など使われている場合は少し違う部分もあるかもしれません。
アプリケーションフォルダー内の [CONTENT] フォルダーの中身を丸ごと、ドキュメントフォルダー内に [copyContent] というフォルダを作成してコピーし、その中の「start.exe」をキックして自身は終了します。詳細はコード内のコメント参照
ActionScript3
import flash.filesystem.File;
import flash.desktop.NativeApplication;
var file;
var existsFlg = false;
//起動する実行ファイル名
var bootFileName = "start.exe";
//コピー元:アプリケーションディレクトリ内
var sourceDir = File.applicationDirectory.resolvePath("CONTENT");
//コピー先:ドキュメントディレクトリ内
var resultDir = File.documentsDirectory.resolvePath("copyContent");
if(resultDir.exists){
file = resultDir.resolvePath(bootFileName);
if(file.exists){
//実行ファイルが存在したらコピーしないでキックする
existsFlg = true;
}else{
//コピー先ディレクトリが存在するけれど実行ファイルが存在しない場合は、ディレクトリを丸ごと削除する(同期処理)
resultDir.deleteDirectory(true);
}
}
if(existsFlg){
//実行ファイルをキック
bootExe();
}else{
//コピー処理(非同期)
sourceDir.addEventListener(Event.COMPLETE, FileCopyToAsyncCompleteFunc );
function FileCopyToAsyncCompleteFunc(event:Event): void{
//コピー完了→実行ファイルをキック
bootExe();
}
sourceDir.addEventListener(IOErrorEvent.IO_ERROR, FileCopyToAsyncIOErrorFunc );
function FileCopyToAsyncIOErrorFunc(event:IOErrorEvent): void{
//コピー失敗
//なんからのエラー表示など
}
sourceDir.copyToAsync(resultDir,true);
}
function bootExe(){
//起動ファイルキック
var nativeProcessStartupInfo = new NativeProcessStartupInfo();
var file = resultDir.resolvePath(bootFileName);
nativeProcessStartupInfo.executable = file;
var process = new NativeProcess();
process.start(nativeProcessStartupInfo);
//アプリ終了
var app:NativeApplication = NativeApplication.nativeApplication;
app.exit(0);
}