1

Windows.Storage.FileIO (createFileAsync、readTextAsync、writeTextAsync) を使用してローカル ファイルに書き込む Windows ストア用のアプリを作成しました。

私の計画は、ファイルを単純なデータベースとして使用することです (データは単なる JSON 形式のユーザー情報です)。これは悪い考えですか?

この方法で書き込まれたファイルは本当に永続的ですか (または、アプリの更新時に削除されますか)? ユーザー自身がそれらを削除できますか (たとえば、Cookie/一時インターネット ファイルなどを削除することにより)?

アプリによってローカルでディスクに書き込まれたファイルが「Metro」環境でどのように扱われるのか疑問に思っています...

4

1 に答える 1

11

それが「悪い考え」かどうかという問題は非常に主観的なものであるため、おそらく適切な場所ではありません。

ただし、Windows ストア アプリが保存したファイルを処理する方法に関しては、Windows.Storage.ApplicationData.current.localFolder を使用してファイルを作成または編集する場合、ユーザーがアプリをアンインストールするまで、これらのファイルを使用できます。アプリの更新をストアにプッシュし、ユーザーが更新をダウンロードしてインストールした場合、プログラムで明示的に変更しない限り、ファイルはユーザーのコンピューターに残ります。

私が作成した 2 つのアプリでは、localFolder を利用してアプリのデータの JSON 表現を保存し、起動時間を最小限に抑え、アプリが起動して初期 UI をユーザーに表示したら、バックグラウンドでデータを更新します。 .

私のコード(おそらく少し最適化される可能性があります)は次のようになります。

appData.current.localFolder.createFileAsync("leaderboard.txt", 
    Windows.Storage.CreationCollisionOption.openIfExists)
.then(function (file) {
    leaderboardFile = file;
    return Windows.Storage.FileIO.readTextAsync(file)
})
.then(function (fileContents) {
    cachedLeaderboard = fileContents;
    if (!cachedLeaderboard || isRefresh) {
        return WinJS.xhr(xhrOptions)
    }
    else {
        cachedLeaderboard = JSON.parse(cachedLeaderboard);
        List = new WinJS.Binding.List(cachedLeaderboard);
        completed(List);
    }
})
.then(function (result) {
    if (result) {
       var items = JSON.parse(result.responseText).d;
       localLeaderboard = items;
       return Windows.Storage.FileIO.writeTextAsync(leaderboardFile, 
           JSON.stringify(localLeaderboard))
    }
})
.then(function () {
    if (!localLeaderboard)
    localLeaderboard = cachedLeaderboard;
    List = new WinJS.Binding.List(localLeaderboard);
    completed(List);
})

基本的に、コードは Leaderboard.txt ファイルが存在するかどうか (または呼び出しがデータの更新であるかどうか) を確認し、存在しない場合は XHR 呼び出しを行ってデータを取得し、バインディング リストを作成してそれをpromise でラップされた呼び出し元 (promise コードは表示されません)。ファイルが存在し、要求が更新でない場合は、テキスト ファイルを解析し、そこからバインディング リストを作成します。

それが役立つことを願っています!

于 2012-10-05T14:12:51.780 に答える