Help us understand the problem. What is going on with this article?

AdobeAIR for Desktop アプリがCDで動作しないので、ドキュメントにコピーしてキックする

More than 5 years have passed since last update.

経緯

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


Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away