便利なのはいいんだけど,セキュリティーエラーにハマっちゃって・・・.
ハマった割にはたいしたこと無かったけど,知らなかったら解決しない問題なのでメモしておく.
// 保存先
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 件のコメント:
コメントを投稿