2015-04-17 32 views
0

在讀取它之前是否需要在C#中鎖定xml文件,以及是否從未寫回該文件。我應該在C#中讀取文件之前鎖定文件嗎?

如果我使用,

using(FileStream fileStream = new FileStream(
       "myXmlFile.xml", 
       FileMode.Open, 
       FileAccess.Read, 
       FileShare.Read)) 

是有任何機會,在多線程環境中,兩個用戶可以在同一時間訪問同一個文件,並得到一個鎖定錯誤?

+0

你是什麼意思的「鎖定文件」?你究竟是什麼意思? –

+1

你已經在鎖定文件。 'FileShare.Read'將允許其他進程打開文件供讀取,但不能寫入。如果另一個進程試圖打開文件進行寫入,則會失敗。 –

回答

1

不,您不需要在讀取文件之前鎖定文件。你需要鎖定它的唯一原因是如果你想確保在閱讀文件時文件不會被改變。

是的,如果您使用該代碼鎖定文件,則其他用戶如果嘗試寫入文件或使用讀/寫權限讀取文件時可能會出現鎖定錯誤。我工作的程序很常見。

除非實際需要,否則不應該鎖定文件。

如果您不想鎖定文件,請使用ReadWrite共享枚舉。

using(FileStream fileStream = new FileStream(
       "myXmlFile.xml", 
       FileMode.Open, 
       FileAccess.Read, 
       FileShare.ReadWrite)) 
+1

此外,如果您正在寫入文件,您可能需要鎖定一個文件 – user1

+0

「您需要鎖定文件的唯一原因是,如果您想確保文件不會被更改,你正在閱讀它。「那麼「僅」99.9%的時間呢? –

+0

@JonHanna不是真的,取決於文件是什麼可能或可能不重要。如果你正在閱讀一個文本文件,那麼如果你寫的代碼是正確的,那麼它就不會起作用,但是如果你正在閱讀一個圖片文件,那麼如果它正在閱讀,它會被破壞。這取決於實際情況。就我個人而言,我總是嘗試寫我的代碼來支持被修改的文件。不需要通過鎖定文件來破壞另一個程序。 – CathalMF

1

是的,你應該像在那裏一樣精確地鎖定它。

請注意,您在這裏的鎖定不會阻止其他線程或進程讀取(這不會導致您的困難),但只能防止寫入。爲防止閱讀(因爲您要更改文件),請使用FileShare.None

只有在您能夠容忍被更改的文件時,才能容忍被更改的文件,或者通過將文件傳遞給可以處理該文件的內容來隱式地進行更改(而不是.NET中的任何XML解析方法)或通過捕捉造成的問題來明確。

相關問題