在Windows10通用Javascript应用程序中写入文件有时会失败

Writing to File Sometimes Failing in Windows 10 Universal Javascript App

本文关键字:文件 失败 通用 Windows10 Javascript 应用程序      更新时间:2023-09-26

我开发了一个适用于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.writeTextAsyncWindows.Storage.FileIO.readTextAsync

我还发现,当要解析的字符串为空(")时,JSON.parse会崩溃(引发错误)。在您的情况下,我看到它也可能是一个问题,因为您只在它为null或未定义的情况下进行测试,而不是在它为空的情况下。