Windows手机隔离存储防止退出时文件损坏

时间:2014-01-15 07:59:24

标签: c# windows-phone isolatedstorage

在Windows手机上使用隔离存储的新功能。

我想在Windows Phone应用程序中使用独立存储将一些信息保存在xml文件中。我只是想知道,如果在我写入xml文件时用户或应用程序存在,我可能最终会遇到一些数据损坏?是这样的吗?如果是这样,我该如何防范这个?

1 个答案:

答案 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

数据库不能避免这个问题,他们解决了这个问题。他们仍然在幕后使用文件,并且包含所有逻辑以执行类似于上面的伪代码的操作,包括锁定方案以避免所有边缘情况。