在Windows 10物联网中安全保存文件

tym*_*tam 5 c# io windows-10-iot-core windowsiot

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

该文件不能被损坏,但是如果由于断电等原因导致保存失败,可以删除最新版本。

由于文件IO发生了很大变化(不再有File.Replace),因此我们不确定如何实现它。

我们可以看到:

var file = await folder.CreateFileAsync(fileName, CreationCollisionOption.OpenIfExists);
await Windows.Storage.FileIO.WriteTextAsync(file, data);
Run Code Online (Sandbox Code Playgroud)

确实是不可靠的(在停止调试或重置设备时反复损坏。),最后我们得到的是损坏的文件(全为零),旁边是.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); 
Run Code Online (Sandbox Code Playgroud)

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

han*_*ker 1

不确定是否有最佳实践,但如果需要我自己想出一些东西:

我会做一些事情,比如计算校验和并将其与文件一起保存。

下次保存时,不要覆盖它,而是将其保存在前一个的旁边(应该是“已知良好”),只有在验证新的保存成功完成后才删除前一个(连同校验和)

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