1

我已经为 Windows Store 构建了一个应用程序,它使用 Windows.Storage.FileIO(createFileAsync、readTextAsync 和 writeTextAsync)写入本地文件。

我的计划是将该文件用作一个简单的数据库(数据只是 JSON 格式的用户信息)。这是一个坏主意吗?

以这种方式编写的文件是否真的持久(或者在更新应用程序时它们被删除)?用户自己可以删除它们(例如通过删除 cookie/临时 Internet 文件等)吗?

我只是想知道“Metro”环境如何处理应用程序本地写入磁盘的文件......

4

1 回答 1

11

这是否是一个“坏主意”的问题是相当主观的,所以可能不是合适的场所。

但是,就 Windows 应用商店应用程序如何处理您存储的文件而言,如果您使用 Windows.Storage.ApplicationData.current.localFolder 创建和/或编辑文件,这些文件将一直可用,直到用户卸载应用程序。如果您将应用程序的更新推送到商店,并且用户下载并安装更新,则文件将保留在用户的计算机上,除非您以编程方式显式修改它们。

在我构建的两个应用程序中,我利用 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调用以获取数据,然后创建一个绑定列表并将其传回给调用者包裹在一个承诺中(承诺代码未显示)。如果文件存在,并且请求不是刷新,我只需解析文本文件并从中创建绑定列表。

希望有帮助!

于 2012-10-05T14:12:51.780 回答