C# win store应用程序直接写入文件

C# win store应用程序直接写入文件,c#,windows-store-apps,xmlwriter,C#,Windows Store Apps,Xmlwriter,我有一个非常简单的问题,但是在搜索了很多论坛后,我找不到答案。 我有一个windows应用商店应用程序,它定期(使用计时器)将数据保存到xml文件中。有时,由于系统崩溃,或者应用程序被用户终止,或者由于其他一些异常,xml在保存过程中被破坏(尽管要保存的数据是有效的),这会导致很多不一致。我发现一篇帖子提到直接将数据写入磁盘(使用FileStream的FileOptions.WriteThrough选项),但是.NET for Win 8没有这些选项。 有没有一种方法可以确保xml在所有这些事件

我有一个非常简单的问题,但是在搜索了很多论坛后,我找不到答案。 我有一个windows应用商店应用程序,它定期(使用计时器)将数据保存到xml文件中。有时,由于系统崩溃,或者应用程序被用户终止,或者由于其他一些异常,xml在保存过程中被破坏(尽管要保存的数据是有效的),这会导致很多不一致。我发现一篇帖子提到直接将数据写入磁盘(使用FileStream的FileOptions.WriteThrough选项),但是.NET for Win 8没有这些选项。 有没有一种方法可以确保xml在所有这些事件中都不会损坏,并且数据能够可靠地保存?我可以复制文件,但仍然想知道是否有其他可靠的方法来处理这个问题

以下是在计时器中保存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。我将尝试一下,看看它在我的应用程序中是如何工作的。我会给你回复我的观察结果。再次感谢!