【发布时间】:2014-01-15 07:59:24
【问题描述】:
刚开始在 Windows Phone 上使用隔离存储。
我想在我的 Windows Phone 应用程序中使用隔离存储将一些信息保存在 xml 文件中。我只是想知道,如果在我写入 xml 文件时用户或应用程序存在,我可能最终会出现一些数据损坏?是这样吗?如果是这样,我该如何防止这种情况发生?
【问题讨论】:
标签: c# windows-phone isolatedstorage
刚开始在 Windows Phone 上使用隔离存储。
我想在我的 Windows Phone 应用程序中使用隔离存储将一些信息保存在 xml 文件中。我只是想知道,如果在我写入 xml 文件时用户或应用程序存在,我可能最终会出现一些数据损坏?是这样吗?如果是这样,我该如何防止这种情况发生?
【问题讨论】:
标签: c# windows-phone isolatedstorage
在大多数文件系统/操作系统上的写入操作期间,几乎所有类型的文件都可能损坏 - 最坏的情况是,您有一个大文件需要几秒钟才能写入磁盘,并且在保存时电池会掉电.所以我的回答并不特定于 Windows Phone。
一种常见的解决方法是创建一个临时文件,然后替换/重命名它。重命名文件是一个原子操作,这意味着它要么发生,要么不发生——两者之间没有任何关系。
所以下面的伪代码是安全的:
SaveFile(filename))
SaveNewFile(stream, filename + ".new.tmp")
TryDeleteFile(filename + ".old.tmp")
RenameFile(filename, filename + ".old.tmp")
RenameFile(filename + ".new.tmp", filename)
DeleteFile(filename + ".old.tmp")
LoadFile(filename)
TryRenameFile(filename + ".old.tmp", filename)
OpenFile(filename)
如果替换操作可用,这会更简单:
SaveFile(filename)
SaveNewFile(stream, filename + ".new.tmp")
ReplaceFile(filename, filename + ".new.tmp")
LoadFile(filename)
OpenFile(filename)
如果多个进程访问同一个文件,它确实会变得更棘手,因为你需要锁定文件以覆盖边缘情况。避免损坏的一种更简单的方法是使用数据库,如下所示:
http://msdn.microsoft.com/en-US/library/windowsphone/develop/hh202860(v=vs.105).aspx
数据库并没有避免这个问题,而是解决了这个问题。他们仍然在幕后使用文件,并且确实包含执行类似于上述伪代码的所有逻辑,包括避免所有边缘情况的锁定方案。
【讨论】: