c# - 保存的文件有时只包含 NUL 字符

标签 c# windows-runtime async-await winrt-async

我们的 Windows 8.1 应用程序 (WinRT) 存在问题,有时我们保存的文件会损坏。这些文件的文件大小正确,但文件仅包含 NUL 字符。该文件应包含 XML 形式的序列化对象。

为了找到我们不覆盖文件的问题,我们执行以下操作:

  1. 将当前对象序列化为临时文件。
  2. 检查临时文件的内容
  3. 复制当前文件(到.timestamp.xml.bak)
  4. 将临时文件移动/替换为当前文件

大多数时候一切正常,但有时 .timestamp.xml.bak 文件和内容文件会损坏。除此之外,日志文件也会损坏(也只有 NUL 字符)。整个文件由 NUL 字符组成。当我查看 bak 文件和主文件的踪迹时,我看到主文件的大小增加了。这应该是正确的,因为添加了一个新的 XML 元素。但它不包含 XML。

我不知道这是怎么发生的,为什么会发生。它发生在大约 5% 的应该被编辑的文件中,并且每个损坏的文件都会在 5-20 次保存尝试后发生。它也发生在几台平板电脑上。

这是创建损坏文件的代码片段:

StorageFile file = await lDataFld.CreateFileAsync(filename + ".tmp",  CreationCollisionOption.OpenIfExists);

StorageFile oldFile = await dataFld.GetFileAsync(filename + ".xml");
if (oldFile != null)
{
await oldFile.CopyAsync(dataFld, string.Format("{0}.{1}.xml.bak", filename, DateTime.Now.ToString("yyyyMMddHHmmssfffffff")), NameCollisionOption.ReplaceExisting);
}
await file.MoveAndReplaceAsync(await dataFld.GetFileAsync(filename + ".xml"));

Logger.Log(string.Format("Saved {0}.", filename));

有人能告诉我我们如何最终得到仅包含 NUL 字符的文件以及这是如何/为什么发生的吗?更好的是如何修复它。

一个小补充: 我们无法以任何方式重现此问题,它只发生在我们的生产环境中。

最佳答案

我能想到的可能产生这个结果的唯一原因是:

  • 在文件写入过程中操作系统硬崩溃 (BSOD)
  • 应用程序在文件写入过程中终止

我假设这是第二个原因。

鉴于此以及您说它是一个 Windows 运行时应用程序这一事实,我猜该应用程序没有被手动终止,我的猜测是它与 windows runtime lifecycle 有关.鉴于 UWP 应用程序在进入后台时可以“挂起”,然后在“挂起”模式下随时可能被操作系统终止(非常类似于 Android 或 IOS 上的移动操作系统)。

鉴于此,我的猜测是您的应用程序在暂停之前启动异步操作,然后在完成文件写入之前暂停/终止。

解决方法是确保您将应用标记为在执行文件写入时正在执行“后台”工作,这样操作系统就不会在文件写入期间挂起您。几乎所有移动操作系统都具有这种类型的功能,允许您稍微“超限”以确保您可以在应用程序暂停/终止之前完成工作。对于 UWP 应用,请查看 background tasks或研究如何 handle app suspend/postponing app suspend .

关于c# - 保存的文件有时只包含 NUL 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25288460/

相关文章:

c# - 具有客户端证书和基本身份验证的 WCF 客户端

c# - 在 .NET 中,为什么常量在编译时而不是在 JIT 时求值?

c# - 我应该通过 RedirectToAction 还是 TempData 传递值?

c# - 如何在 Windows8 中使用 MediaElement 更改视频的位置?

c# - 忽略异步而不等待编译警告

javascript - 为什么在递归异步函数中添加 then 会使其返回未定义?

c# - 目录存在与路径组合与字符串连接

c# - 为什么我不能在 WinRT 中从 AppData 读取 XML?

c# - winrt中的并行循环

javascript - 生成器产生的 promise 在等待时未同时解决