Практически каждый вид файла может быть поврежден во время операции записи в большинстве файловых систем/операционных систем - в худшем случае у вас есть большой файл, который занимает пару секунд, чтобы записать на диск, а батарея выпадает при сохранении Это. Поэтому мой ответ не относится к 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
Базы данных не избежать этой проблемы, они решают его. Они по-прежнему используют файлы за кулисами и содержат всю логику, чтобы сделать что-то похожее на псевдокод выше, включая схемы блокировки, чтобы избежать всех случаев краев.