【发布时间】:2018-06-08 09:19:04
【问题描述】:
我们的 Windows 8.1 应用程序 (WinRT) 存在问题,有时我们保存的文件会损坏。这些文件具有正确的文件大小,但该文件仅包含 NUL 字符。该文件应包含一个作为 XML 的序列化对象。
为了找到我们没有覆盖文件的问题,我们执行以下操作:
- 将当前对象序列化为临时文件。
- 检查临时文件的内容
- 复制当前文件(到.timestamp.xml.bak)
- 将临时文件移动/替换到当前文件
大多数情况下,这一切正常,但有时 .timestamp.xml.bak 文件和内容文件会损坏。除此之外,日志文件也会损坏(也只有 NUL 字符)。整个文件由 NUL 字符组成。当我查看 bak-files 和主文件的踪迹时,我看到主文件的大小增加了。这应该是正确的,因为添加了一个新的 XML 元素。但它不包含 XML。
我不知道这是如何以及为什么会发生的。它发生在大约 5% 的应该被编辑的文件中,每个损坏的文件都会在 5-20 次保存尝试后发生。它也发生在几台平板电脑上。
这是创建损坏文件的代码的 sn-p:
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 字符的文件,以及如何/为什么会发生这种情况?更好的是如何修复它。
一个小补充: 我们无法以任何方式重现此问题,它只会出现在我们的生产环境中。
【问题讨论】:
-
哦,太好了,零响应。我在你的同一条船上。我们无法重现该问题。我们在测试中从未遇到过。我们只知道它的存在是因为我们在客户的机器上看到过它。
-
可能与此答案中描述的问题相同吗? stackoverflow.com/a/52751216/930546
标签: c# windows-runtime async-await winrt-async