2010-04-20 64 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