C# win store应用程序直接写入文件
我有一个非常简单的问题,但是在搜索了很多论坛后,我找不到答案。 我有一个windows应用商店应用程序,它定期(使用计时器)将数据保存到xml文件中。有时,由于系统崩溃,或者应用程序被用户终止,或者由于其他一些异常,xml在保存过程中被破坏(尽管要保存的数据是有效的),这会导致很多不一致。我发现一篇帖子提到直接将数据写入磁盘(使用FileStream的FileOptions.WriteThrough选项),但是.NET for Win 8没有这些选项。 有没有一种方法可以确保xml在所有这些事件中都不会损坏,并且数据能够可靠地保存?我可以复制文件,但仍然想知道是否有其他可靠的方法来处理这个问题 以下是在计时器中保存xml的代码:-C# win store应用程序直接写入文件,c#,windows-store-apps,xmlwriter,C#,Windows Store Apps,Xmlwriter,我有一个非常简单的问题,但是在搜索了很多论坛后,我找不到答案。 我有一个windows应用商店应用程序,它定期(使用计时器)将数据保存到xml文件中。有时,由于系统崩溃,或者应用程序被用户终止,或者由于其他一些异常,xml在保存过程中被破坏(尽管要保存的数据是有效的),这会导致很多不一致。我发现一篇帖子提到直接将数据写入磁盘(使用FileStream的FileOptions.WriteThrough选项),但是.NET for Win 8没有这些选项。 有没有一种方法可以确保xml在所有这些事件
folder = await StorageFolder.GetFolderFromPathAsync(path);
stream = await folder.OpenStreamForWriteAsync(SystemConfiguration.TASK_XML,CreationCollisionOption.ReplaceExisting); serializer = new XmlSerializer(typeof(Tasks));
using (XmlWriter xmlWriter = XmlWriter.Create(stream, xmlWriterSettings))
{
serializer.Serialize(xmlWriter,Global.UserTasks);
xmlWriter.Dispose();
}
stream.Dispose();
谢谢 您应该能够使用StorageStreamTransaction对象来帮助确保提交文件。如果应用程序在事务提交之前崩溃,则文件系统应将文件回滚到其初始状态 我不是XmlWriter专家,所以这只是伪代码,但希望这将为您指明正确的方向:
using (StorageStreamTransaction transaction = await file.OpenTransactedWriteAsync())
{
var serializer = new XmlSerializer(typeof([Type]));
using (XmlWriter xmlWriter = XmlWriter.Create(transaction, xmlWriterSettings))
{
serializer.Serialize(xmlWriter, [Object]);
await transaction.CommitAsync();
}
}
文档可以使用一些更新,我会看看我能做些什么
我希望这有帮助
詹姆斯噢,我的……这比我想象的要简单得多,我这边有点怀念。 CreationCollisionOption.ReplaceExisting参数正在创建新文件,如果应用程序在创建文件和使用serializer.Serialize方法写入文件之间崩溃,则创建的文件已损坏且为空。 我用CreationCollisionOption.OpenIfExists替换了该参数,并且该参数有效,因此,如果在serializer.Serialize方法中写入文件失败,则该文件仍然具有我想要的旧数据
我仍在考虑使用ReplaceIfExisting参数的场景,因为我现在看到的OpenIfExists更方便、更有用。您仍然可以在应用程序文件夹中写入这些数据,而无需任何特殊权限。@Astro。是的,Astro,我只将数据保存在本地文件夹中,但在上述场景中xml仍然损坏。您需要阻止用户在流写入文件时终止应用程序?虽然这是一个更简单的场景(阻止用户终止应用程序),由于操作系统错误/线路BOD崩溃,我无法阻止系统崩溃/重启。谢谢James。我将尝试一下,看看它在我的应用程序中是如何工作的。我会给你回复我的观察结果。再次感谢!