未だに解決方法が見つかってないけど、とりあえずやったことをメモしてく。
[2014.8.30追記] 解決しました。ファイル保存は問題ない模様。
はじめに
Windowsストアアプリで LocalFolder に対してファイル保存をしてる。
MSDNにサンプルもあるので、ほぼその通りにコード書いて、Visual Studio上での実行も問題なし。
意気揚々とストアへ申請して見事に審査通過。
よっしゃ使ったるか!とDL&インストールすると…使えない。
片っ端からTry~Catch入れてメッセージを出すと、
「アクセスが拒否されました」のメッセージ。
多分ファイルを書き込みしているところで落ちてると思われる。
何にしても原因が掴めないので、Visual Studioでアタッチすると…
普通に動くし。
デタッチすると…
エラー出るし。
なんじゃこりゃ。
最初のコード
基本的にはここに書かれてるようなこと参考にしてた。
クイック スタート: ローカル アプリ データ (XAML)
他にも色々調べて若干変えてるけどね。
やってることは、クラスをJSON形式のテキストにシリアライズして保存してるだけ。
var file = await ApplicationData.Current.LocalFolder.CreateFileAsync(FILENAME, CreationCollisionOption.ReplaceExisting); using (var stream = (await file.OpenAsync(FileAccessMode.ReadWrite)).AsStream()) using (TextWriter writer = new StreamWriter(stream)) { var strJson = JsonConvert.SerializeObject(_clips.ToList()); await writer.WriteAsync(strJson); }
でもこれはダメだった。
次のコード
なんか最初に GetFileAsync するといいよ。とか、DataWriter 使って、ちゃんと DetachStream() した方がいいよとか見たので追記。
StorageFile file = null; try { file = await ApplicationData.Current.LocalFolder.GetFileAsync(FILENAME); } catch (Exception ex) { Tool.Msg(ex.Message, "Sorry!"); return false; } try { if (file == null) { file = await ApplicationData.Current.LocalFolder.CreateFileAsync(FILENAME, CreationCollisionOption.ReplaceExisting); } using (var stream = (await file.OpenAsync(FileAccessMode.ReadWrite)).AsStream().AsOutputStream()) using (var writer = new DataWriter(stream)) { var strJson = JsonConvert.SerializeObject(_clips.ToList()); writer.WriteString(strJson); await writer.StoreAsync(); writer.DetachStream(); await stream.FlushAsync(); } } catch(Exception ex) { Tool.Msg(ex.Message, "Sorry!"); return false; }
これもダメ。
マニフェストを変えてみる
かなり適当だけど、ファイルオープンピッカー と、ファイル保存ピッカーに .txt を追加。
まぁダメだわな。
暫定まとめ
とりあえず対応したのはここまで。
ストアが更新されてからでないと結果が分からんというのがつらい。
公開はされてしまってるので、いつ星1つ付けられるんじゃないかとヒヤヒヤしてるw
引き続き調べるけど、だんだん当てがなくなってきた。