2010-04-20 100 views

回答

7

如果你这样保存,你应该没有任何问题。

using (var file = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None)) 
{ 
    xmlDoc.Save(file); 
} 
+0

打了我大约3秒钟。有一个upvote :) – 2010-04-20 19:52:10

2

我不认为有任何原子性的保证。你不应该依赖它。

+0

保存一个临时文件,然后重命名呢?重命名可以自动完成,还是文件系统不能以这种方式工作? – 2010-04-20 20:09:38

+0

我会认为重命名会完成这项工作。这取决于你需要多少“保证”。如果你想要一个“真正的”保证,那么你希望查看文档中的操作是原子的声明。您可能需要使用Reflector来查看.NET代码,以查看Win32调用它的内容,然后研究这些调用是否是原子的。否则,可能很好地认识到,在同一卷上从一个目录重命名为另一个目录实际上只是创建一个新目录条目并删除旧目录条目。不复杂,可能是原子。 – 2010-04-20 20:19:49

2

写入文件通常不是原子的。查看Process Monitor以了解操作系统公开的内容。 (字符串)使用FileShare.Read。 ChaosPandion的解决方案指定FileShare.None。查看MSDN上的System.IO.FileShare以了解其差异。

0

这个答案https://stackoverflow.com/a/487198/1429390以简单易用的方式为AFAIK提供了某种原子性。其原理是在临时文件中写入,并为来电者提供在关闭时重命名文件(以及其他任何您想要的内容)的机会。这样,创建和填充文件时可能发生的任何事情都无法破坏可能存在的文件。

更新:除非它不是因为System.IO.File.Move()拒绝覆盖。有关解决方法,请参阅https://stackoverflow.com/a/10305475/1429390