反正有沒有其他進程監視使用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. 這個說法是一個原子操作?
- 7. File.Move原子操作
- 8. 非原子操作
- 9. DerbyJS原子操作
- 10. 原子操作 - C
- 11. Redis的set命令是一個原子操作嗎?
- 12. !!boolean是java中的一個原子操作嗎?
- 13. Java中的File.rename() - 它是一個原子操作嗎?
- 14. 是「雲中」gsutil cp的一個原子操作嗎?
- 15. boost線程 - 是scoped_ptr :: reset()一個原子操作?
- 16. 原子操作和原子交易
- 17. 是FD_SET,FD_CLR ...原子操作嗎?
- 18. plot.lm錯誤:$操作是原子向量
- 19. Azure Put Blob操作是否爲原子?
- 20. 是數據庫操作原子
- 21. 嵌套的原子操作保證是原子嗎?
- 22. 的Javascript原子一系列操作
- 23. 是IsolatedStorageFile.CopyFile()的一個原子動作?
- 24. Memcached - GET和SET操作是否爲原子操作?
- 25. 原子執行多個操作
- 26. Redis中的原子操作
- 27. x86 128位原子操作
- 28. Riak的原子操作?
- 29. 拉推原子操作?
- 30. Django中的原子操作?
打了我大約3秒鐘。有一個upvote :) – 2010-04-20 19:52:10