反正有没有其他进程监视使用XMLDocument.Save()创建的文件可能会遇到部分文件?如果Save()覆盖现有文件,它有什么区别吗?是XMLDocument.Save一个原子操作?
回答
如果你这样保存,你应该没有任何问题。
using (var file = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None))
{
xmlDoc.Save(file);
}
我不认为有任何原子性的保证。你不应该依赖它。
保存一个临时文件,然后重命名呢?重命名可以自动完成,还是文件系统不能以这种方式工作? – 2010-04-20 20:09:38
我会认为重命名会完成这项工作。这取决于你需要多少“保证”。如果你想要一个“真正的”保证,那么你希望查看文档中的操作是原子的声明。您可能需要使用Reflector来查看.NET代码,以查看Win32调用它的内容,然后研究这些调用是否是原子的。否则,可能很好地认识到,在同一卷上从一个目录重命名为另一个目录实际上只是创建一个新目录条目并删除旧目录条目。不复杂,可能是原子。 – 2010-04-20 20:19:49
写入文件通常不是原子的。查看Process Monitor以了解操作系统公开的内容。 (字符串)使用FileShare.Read。 ChaosPandion的解决方案指定FileShare.None。查看MSDN上的System.IO.FileShare以了解其差异。
这个答案https://stackoverflow.com/a/487198/1429390以简单易用的方式为AFAIK提供了某种原子性。其原理是在临时文件中写入,并为来电者提供在关闭时重命名文件(以及其他任何您想要的内容)的机会。这样,创建和填充文件时可能发生的任何事情都无法破坏可能存在的文件。
更新:除非它不是因为System.IO.File.Move()拒绝覆盖。有关解决方法,请参阅https://stackoverflow.com/a/10305475/1429390。
- 1. 是一个比较原子操作吗?
- 2. 写一个原子操作
- 3. 什么操作都是原子操作
- 4. 是原子变量的多重赋值,是一个原子操作吗?
- 5. 让两个操作原子
- 6. CUDA:还原还是原子操作?
- 7. 原子操作 - C
- 8. DerbyJS原子操作
- 9. File.Move原子操作
- 10. Redis的set命令是一个原子操作吗?
- 11. !!boolean是java中的一个原子操作吗?
- 12. 是“云中”gsutil cp的一个原子操作吗?
- 13. Java中的File.rename() - 它是一个原子操作吗?
- 14. 原子操作和原子交易
- 15. 是FD_SET,FD_CLR ...原子操作吗?
- 16. plot.lm错误:$操作是原子向量
- 17. Azure Put Blob操作是否为原子?
- 18. 是数据库操作原子
- 19. 嵌套的原子操作保证是原子吗?
- 20. 的Javascript原子一系列操作
- 21. 原子执行多个操作
- 22. Memcached - GET和SET操作是否为原子操作?
- 23. 挥发和原子操作
- 24. x86 128位原子操作
- 25. ARM中的原子操作
- 26. Qt原子操作实现
- 27. 原子操作实现
- 28. Django中的原子操作?
- 29. CUDA中的原子操作
- 30. CUDA原子操作列表
打了我大约3秒钟。有一个upvote :) – 2010-04-20 19:52:10