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

时间:2014-08-13 14:12:21

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

我们的Windows 8.1应用程序(WinRT)中存在一个问题,即有时我们保存的文件已损坏。这些文件的文件大小正确,但该文件只包含NUL字符。该文件应包含一个序列化对象作为XML。

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

  1. 将当前对象序列化为临时文件。
  2. 检查临时文件的内容
  3. 复制当前文件(至.timestamp.xml.bak)
  4. 将临时文件移动/替换为当前文件
  5. 大多数情况下,这一切都运行正常,但有时.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字符的文件以及如何/为何会发生这种情况?甚至更好的解决方法。

    一个小小的愿望: 我们不能以任何方式重现这个问题,它只发生在我们的生产环境中。

1 个答案:

答案 0 :(得分:1)

我能想到的唯一原因可能是:

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

我认为这是第二个原因。

考虑到这一点以及您说它是Windows运行时应用程序这一事实并且我猜测应用程序没有被手动终止,我的猜测是它与{{{{{{{{{ 3}}。鉴于UWP应用程序可以被暂停"当它进入后台,然后可以在操作系统终止时暂停"暂停"模式(非常类似于Android或IOS上的移动操作系统)。

所以考虑到这一点,我的猜测是你的应用程序在被挂起之前启动异步操作,然后在它完成你的文件写入之前被暂停/终止。

修复方法是确保您的应用标记为“正在进行”#34;背景"在进行文件写入时工作,以便在写入文件时操作系统不会暂停。几乎所有的移动操作系统都有这种类型的功能,以允许你超越"溢出"稍微确保您可以在应用程序暂停/终止之前完成工作。对于UWP应用,请查看windows runtime lifecycle或查看如何background tasks / handle app suspend