javascript - 在 Windows 10 通用 Javascript 应用程序中写入文件有时会失败

标签 javascript file-io win-universal-app winjs windows-10-universal

我开发了一个适用于 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/

相关文章:

c# - 使用 File.Create() 后另一个进程正在使用的文件

android - 如何使用 cordova 文件/文件系统根插件访问外部存储?

regex - 在 Perl 中使用正则表达式列出来自另一个 Perl 脚本的变量

javascript - Angular 2 : EXCEPTION: No provider for Angulartics2GoogleAnalytics

javascript - 请求对象和响应对象

javascript - 使用 tooltipster 获取要呈现的工具提示?

c# - 在Ui线程上执行同步操作

javascript - 使用 React 重定向

c# - 如何将 Windows Phone 8.1 应用程序部署到 Windows 10 移动设备?

win-universal-app - 定义悬停在通用应用程序中时按钮的样式