我开发了一个适用于 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”——这个额外的文件被称为“data-84DB.TMP”或类似的东西——显然是作为文件 io API 的一部分创建的临时文件。在我的应用程序崩溃的情况下,此文件中包含您通常希望在“数据”文件中看到的信息,并且“数据”文件不再是文本格式,当我在 SublimeText 中打开它时它说“0000”。
因此,当我的 loadData 函数运行时,它崩溃了。
现在,在这种情况下,我不希望它默默地失败。我宁愿它崩溃,也不愿在 loadData 中进行 try-catch 并使我的 dataObject 为空,或者在数据未正确保存的情况下进行处理。我宁愿它崩溃,这样至少我可以找到 .TMP 文件并恢复未正确保存的信息。
这个问题正常吗?我是否没有遵循读取和写入持久数据的最佳实践?我该如何解决这个问题?大家知道是什么原因造成的吗?应用程序可能会在文件写入操作过程中意外关闭吗?
最佳答案
我认为最好的做法应该是异步读取和保存。我猜 WinJS.Application.local
是 WinRT API 的包装器,但它是同步工作的。我建议使用 Windows.Storage.FileIO.writeTextAsync 和 Windows.Storage.FileIO.readTextAsync。
我还发现,当要解析的字符串为空(“”)时,JSON.parse
会崩溃(引发错误)。在您的情况下,我发现这也可能是一个问题,因为您仅在它为空或未定义时才进行测试,而不是在它为空时进行测试。
关于javascript - 在 Windows 10 通用 Javascript 应用程序中写入文件有时会失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34745500/