在Windows手机上使用隔离存储的新功能。
我想在Windows Phone应用程序中使用独立存储将一些信息保存在xml文件中。我只是想知道,如果在我写入xml文件时用户或应用程序存在,我可能最终会遇到一些数据损坏?是这样的吗?如果是这样,我该如何防范这个?
答案 0 :(得分:1)
在大多数文件系统/操作系统的写操作期间,几乎每种文件都可能被破坏 - 最糟糕的情况是,你有一个大文件需要几秒钟写入磁盘,并且电池在保存时会掉电。所以我的答案并非针对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
数据库不能避免这个问题,他们解决了这个问题。他们仍然在幕后使用文件,并且包含所有逻辑以执行类似于上面的伪代码的操作,包括锁定方案以避免所有边缘情况。