【问题标题】:win store app write directly to filewin store 应用程序直接写入文件
【发布时间】:2014-12-10 01:18:52
【问题描述】:

我有一个非常简单的问题,但在搜索了很多论坛后找不到答案。 我有一个 Windows 商店应用程序,它定期(使用计时器)将数据保存到 xml 文件中。有时,由于系统崩溃或应用程序被用户在两者之间或其他一些异常终止的情况下,xml 在保存过程中被破坏(尽管要保存的数据是有效的),这会导致很多不一致。我发现一篇文章提到将数据直接写入磁盘(使用 FileStream 的 FileOptions.WriteThrough 选项),但 Win 8 的 .NET 没有这些选项。 有没有办法确保在所有这些事件期间 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();

谢谢!

【问题讨论】:

  • 您仍然可以将这些数据写入应用程序的文件夹中,无需任何特殊权限。
  • @Astro。是的 Astro,我只将数据保存在本地文件夹中,但在上述情况下 xml 仍然损坏。
  • 您需要阻止用户在您的流写入文件时终止应用程序?
  • 虽然这是一个更简单的场景(阻止用户终止应用程序),但由于操作系统错误/崩溃行 BOD,我无法阻止系统崩溃/重新启动。

标签: c# windows-store-apps xmlwriter


【解决方案1】:

哦,天哪……这比我预期的要简单得多,而且我有点想念。 CreationCollisionOption.ReplaceExisting 参数正在创建一个新文件,如果应用程序在创建文件和使用 serializer.Serialize 方法写入文件之间崩溃,则创建的文件已损坏且为空白。 我用 CreationCollisionOption.OpenIfExists 替换了参数并且它工作了,所以如果文件在 serializer.Serialize 方法中写入失败,它仍然有我想要的旧数据。

我仍在考虑 ReplaceIfExisting 参数会有所帮助的场景,因为我现在看到的方式是,OpenIfExists 更方便和有用。

【讨论】:

    【解决方案2】:

    您应该能够使用 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();
        }
    }
    

    StorageStreamTransaction class

    文档可以使用一些更新,我会看看我能做什么。

    希望对你有帮助,

    詹姆斯

    【讨论】:

    • 谢谢詹姆斯。我会试一试,看看它在我的应用程序中是如何工作的。会用我的观察回复你。再次感谢!
    猜你喜欢
    • 2018-09-04
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多