安全保存文件在Windows 10 IoT中



我的团队需要一种防弹的方法来保存文件(小于100kb(在Windows 10 IoT上。

该文件不能损坏,但是如果保存失败,则可以丢失最新版本,等等。

由于文件io已发生了很大变化(不再是文件。更换(,我们不确定如何实现它。

我们可以看到:

var file = await folder.CreateFileAsync(fileName, CreationCollisionOption.OpenIfExists);
await Windows.Storage.FileIO.WriteTextAsync(file, data);

是可靠的不可靠(在停止调试或重置设备时会反复崩溃。(,我们最终将损坏的文件(满是零(和一个.tmp文件旁边的文件。我们可以恢复此.TMP文件,我不相信我们应该基于无证件行为的解决方案。

我们想尝试的一种方式是:

var tmpfile = await folder.CreateFileAsync(fileName+".tmp",
                               CreationCollisionOption.ReplaceExisting);
await Windows.Storage.FileIO.WriteTextAsync(tmpfile, data);
var file = await folder.CreateFileAsync(fileName, CreationCollisionOption.OpenIfExists);
// can this end up with a corrupt or missing file?
await tmpfile.MoveAndReplaceAsync(file); 

总而言之,是否有一种安全的方法可以将一些文本保存到永远不会损坏文件的文件?

不确定是否有最佳为此练习,但如果需要我自己提出什么:

我会做一些诸如计算校验和与文件一起保存的事情。

在下次保存时,不要覆盖它,而是将其保存在上一个旁边(应该是"已知好的"(,并且仅在验证新节省成功完成后才删除上一个校验和(

我还认为,重命名操作不应损坏文件,但我没有研究

本文有一个很好的解释:在uwp中写入文件所涉及的基础过程中写入文件的最佳实践。

突出显示以下常见问题:

  • 文件是部分编写的。
  • 调用其中一种方法时,该应用会收到例外。
  • 操作留在 .tmp 文件后面,该文件名称类似于目标文件名。

在讨论与便利vs-control的讨论中不容易推论的是,尽管创建或编辑操作更容易失败,因为它们做了很多事情,但重命名操作会更容易容忍,如果他们不是在文件系统周围进行物理编写的作品。

您建议首先创建一个临时文件,在正确的轨道上,可以很好地为您服务,但是使用MoveAndReplaceAsync表示您仍然容易受到这些已知问题的影响。

UWP将使用文件系统使用交易模式,并可能创建源和目标文件的各种备份副本。

您可以通过在调用MoveAndReplaceAsync之前删除原始文件来控制最终元素,也可以使用RenameAsync,如果您的临时文件在同一文件夹中,这些组件较少,这些组件应减少故障的区域。p> @hansmbakker沿着这些行有一个答案,您如何识别文件写入取得成功取决于您,但是通过隔离重写操作并在覆盖原始内容之前对其进行验证,如果您需要它是一个好主意防弹


关于失败

我经常观察到 .tmp 文件,当使用 append FileIO写作的变体时, .tmp 文件具有内容在附加之前的原始文件的,但实际文件并不总是具有所有原始客户端,有时是旧内容的混合

根据我的经验,当您对写入操作的整个呼叫结构异步并正确地等待管道时,UWP文件的写入非常可靠。您采取步骤以确保在任何时间点尝试访问同一文件。

当您尝试从同步上下文中操纵文件时,我们可以开始看到您确定的"不可靠"性质,这在代码中发生了很多事情,这些代码正在从旧的同步操作过渡到新的 async async fileio操作的变体。

确保呼叫写入方法的代码是非障碍物并正确等待的,这将使您能够捕获任何可能提出的例外

对于我们传统上同步的开发人员来说,尝试使用lock(){}模式以确保对文件的单一访问,但是您无法轻松地在lock中使用await,并试图做经常成为UWP文件写入问题的来源。

如果您的代码具有锁定机制,可以确保单例访问该文件,请阅读这些文章以获取不同的方法,但它们是旧的,但是一个很好的资源,涵盖了传统同步C#开发人员到Async和Async的过渡和平行开发。

  • .net 4.5
  • 中的并行性新功能
  • 构建异步协调原始基底,第6部分:Asynclock
  • 构建异步协调原始词,第7部分:AsyncreaderWriterlock

其他时候,我们遇到同步约束是当事件或计时器或处置上下文是首先写入文件的触发器时。那里有不同的技术需要参与,请发布另一个问题,尤其是您认为这可能有助于您的问题。:(

最新更新