我开发了一个适用于Windows的通用应用程序。它是在我的业务中部署的,而不是通过应用商店。它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"——这个额外的文件被称作"data84DB.TMP"或类似的东西——显然是作为API文件的一部分创建的临时文件。在我的应用程序崩溃的情况下,这个文件中有你通常希望在"数据"文件中看到的信息,"数据"不再是文本格式,当我在SublimeText中打开它时,它会显示"0000"。
因此,当我的loadData函数运行时,它会崩溃。
现在,我不希望它在这种情况下默默地失败。我宁愿它崩溃,而不是在loadData中尝试捕获并使我的dataObject为空,或者在数据保存不正确的情况下。我宁愿它崩溃,这样至少我可以找到.TMP文件并恢复未正确保存的信息。
这个问题正常吗?我是否没有遵循读取和写入持久数据的最佳实践?如何解决此问题?你们知道是什么原因吗?可能是应用程序在文件写入操作过程中意外关闭?
我认为最好的做法应该是异步读取和保存。我猜WinJS.Application.local
是WinRT API的包装器,但它是同步工作的。我建议使用Windows.Storage.FileIO.writeTextAsync
和Windows.Storage.FileIO.readTextAsync
。
我还发现,当要解析的字符串为空(")时,JSON.parse
会崩溃(引发错误)。在您的情况下,我看到它也可能是一个问题,因为您只在它为null或未定义的情况下进行测试,而不是在它为空的情况下。