2009-07-23

【AIR】applicationDirectoryのセキュリティエラー【Fileクラス】

Fileクラスは,AIRで追加された,一括したファイル・ディレクトリ管理ができる万能クラス.

便利なのはいいんだけど,セキュリティーエラーにハマっちゃって・・・.

ハマった割にはたいしたこと無かったけど,知らなかったら解決しない問題なのでメモしておく.




// 保存先
var oldPlayData:File = (File.applicationDirectory).resolvePath("pd.ini");
// 一時保存先
var newPlayData:File = File.createTempFile();

// どこかでoldPlayDataの内容を読み込み

// どこかでoldPlayDataから更新された内容をnewPlayDataに一時的に保存

// 以下,ウインドウを閉じるときに
// newPlayDataが存在するか確認
if(newPlayData.exists) {
try {
// newPlayDataの内容をoldPlayDataにコピー
newPlayData.copyTo(oldPlayData, true);
}
catch(error:Error) {
trace(error.message);
}

try {
// newPlayDataを削除
newPlayData.deleteFile();
}
catch(error:Error) {
trace(error.message);
}
}

以下,プログラムの構成.



静的プロパティFile.applicationDirectoryはアプリケーションのインストール先を指すFileオブジェクト.

さらに,resolvePathメソッドでpd.iniというファイルパスを作成し,ファイルの保存先(oldPlayData)とする.



さらに,File.createTempFileメソッドで一時保存先(newPlayData)を確保.



oldPlayDataから更新内容があった場合,一時保存先に更新内容を記録しておく.

このへんのプログラムは本題でないので省略.



ウインドウを閉じる時,

一時保存先からコピーしてpd.iniに書き込んだのち,一時保存先のファイルを削除する.





これだけのプログラムなのに,何故か最初のtryで「SecurityError: fileWriteResource」





どーなってんのってググってみたら,

どうやら,applicationDirectoryにおいて,ファイルを作成・書き込みすることはセキュリティ上認められていないらしい.



( ´゚д゚`)エー



その抜け道として,コピー前に,


oldPlayData = new File(oldPlayData.nativePath);


というように,一度nativePath(絶対パスのString)からFileクラスを再宣言すると,

セキュリティエラーから抜けられるとか.



でもそのかわり,

・AIRアプリケーションアンインストール時に自分で作成したファイルは削除されない

・作成したファイルが残っている状態で再インストールしようとするとエラーが発生

引用: applicationDirectory配下のファイルにアクセスする方法 - Fores Labs



あーだめだこれw



素直に,


// アプリケーションのプライベート記憶領域を指定
var oldPlayDataFile:File = (File. applicationStorageDirectory).resolvePath("pd.ini");

とするのが妥当かな.

これだと,applicationStorageDirectoryは,実際のディレクトリ位置がOSによって,

・Windowsの場合
C:\Documents and Settings\[ユーザ名]\Application Data\[AIRアプリID]
\Local Store

・Macの場合
HD/Users/[ユーザー名]/Library/Preferences/[AIRアプリID]/Local Store/

となるので,上記のresolvePathでpd.iniを指定した場合は,


・Windowsの場合
C:\Documents and Settings\[ユーザ名]\Application Data\[AIRアプリID]
\Local Store\pd.ini

・Macの場合
HD/Users/[ユーザー名]/Library/Preferences/[AIRアプリID]/Local Store/pd.ini

となる.

どうやら,このディレクトリはアンインストールと同時に消去されるらしい.





結論:

applicationDirectoryはファイルの書き込みには使用しない

��使うなら読み込み時.事前にパッケージしたswfとか画像データとかを読み込むのに使えばいい)



0 件のコメント: