我开发了适用于Windows的通用应用程序。它部署在我的业务中,而不是通过App Store。 99.9%的时间它功能完善。
但是这个问题发生了几次。
我将JSON格式的持久数据存储在我的应用程序本地数据文件夹中。
要存储我的数据,我使用:
var storeData = function () {
return WinJS.Application.local.writeText('data', JSON.stringify(dataObject));
}
要加载我的数据,我使用:
var loadData = function () {
return WinJS.Application.local.readText('data').then(function (text) {
dataObject = text ? JSON.parse(text) : {};
})
}
有几种情况,在loadData方法中,我的应用程序崩溃了。当我研究它崩溃的原因时,发现我的本地appdata文件夹中有一个额外的文件。显然,应该在那里的文件被称为“数据' - 这个额外的文件称为' data-84DB.TMP'或类似的东西 - 显然是作为文件io API的一部分创建的临时文件。在我的应用崩溃的情况下,此文件中包含您通常希望在“数据”中看到的信息。文件和'数据'文件不再是文本格式,当我在SublimeText中打开它时会显示' 0000'。
因此,当我的loadData函数运行时,它会崩溃。
现在,这不是我希望它无声地失败的情况。我更倾向于崩溃,比如说,只是在loadData中执行try-catch并使我的dataObject为空或者在数据无法保存的情况下。我反而崩溃了,所以至少我可以去找.TMP文件并恢复那些没有正确保存的信息。
这个问题是否正常?我没有遵循读取和编写持久数据的最佳实践吗?我该如何解决这个问题?你们知道是什么原因引起的吗?可能是应用程序在文件写入操作过程中意外关闭了?
答案 0 :(得分:1)
我认为最佳做法应该是异步读取和保存。我猜WinJS.Application.local
是WinRT API的包装器,但它同步工作。我建议使用Windows.Storage.FileIO.writeTextAsync
和Windows.Storage.FileIO.readTextAsync
。
当我要解析的字符串为空时(#34;"),我发现JSON.parse
崩溃(抛出错误)。在你的情况下,我发现它也可能是一个问题,因为你只有在它是空的或未定义的情况下才进行测试,而不是它是空的。