2010-02-15 57 views
3

如果我的文件流正在使用中(每當我嘗試調試時,它會觸及第一行並表示它正在使用中),我如何強制發佈?每次打這個代碼的時候,我得到一個消息,說一些在使用它:正在使用的FileStream

FileStream fileStream = File.Open(@"C:\somefile", FileMode.Open, FileAccess.Read); 
byte[] buffer = new byte[fileStream.Length]; 
...etc. 
fileStream.Close(); 
+0

什麼是正在使用的文件? – SLaks 2010-02-15 20:04:04

回答

17

學習使用using

using (FileStream fileStream = File.Open(@"C:\somefile", FileMode.Open, FileAccess.Read)) 
{ 
    ... 
} 

using結構確保當你離開該文件將被關閉即使發生異常也會阻止。

你的問題可能不在這裏,但在你的代碼中的其他地方。你必須瀏覽所有的代碼,並找到你已經打開文件的地方,但不要將它放在using聲明中。

4

還可以考慮使用

File.ReadAllText(string path); 

File.ReadAllBytes(string path); 

如果您只是想讀取文件的內容,這不是太大。

0

使用using是正確的方法。

您還可以指定fileshare.readwrite選項來打開文件,而不鎖定它。

2

建議利用using聲明是一個很好的建議;但它不是你唯一的選擇。它往往被開發人員傾向於其語法「乾淨」的外觀和易用性。

主要的事情(和什麼using總是確保你)是確保你打電話FileStream.Close無論如何。如果您遇到例外情況,則可能會漏掉此代碼。因此,至少要撥打Close撥打finally區塊。

個人而言,如果我寫的任何錯誤處理我自己,我更喜歡try/catch/finallytry/using/catch。另一種場景我喜歡使用finally是我正在與多個IDisposable對象,我想避免深層嵌套。請看下面的代碼:

try { 
    using (DisposableObject obj1 = GetDisposableObject()) { 
     // do something 

     using (DisposableObject obj2 = GetAnotherDisposableObject()) { 
      // do something else 

      using (DisposableObject obj3 = GetYetAnotherDisposableObject()) { 
       // do even more things 

       // this code is now quite nested 
      } 
     } 
    } 

} catch (SomeException ex) { 
    // some error-handling magic 
} 

現在比較,這樣的:

DisposableObject obj1 = null; 
DisposableObject obj2 = null; 
DisposableObject obj3 = null; 

try { 
    obj1 = GetDisposableObject(); 
    // do something 

    obj2 = GetAnotherDisposableObject(); 
    // do something else 

    obj3 = GetYetAnotherDisposableObject(); 
    // do even more things 

    // this code doesn't have to be nested 

} catch (SomeException ex) { 
    // some error-handling magic 

} finally { 
    if (obj3 != null) obj3.Dispose(); 
    if (obj2 != null) obj2.Dispose(); 
    if (obj1 != null) obj1.Dispose(); 
} 

就個人而言,我覺得後者更加具有可讀性。

顯然,這是個人偏好。上述兩個代碼示例達到相同的結果。

+0

但是如果我使用使用,那麼即使發生異常,它也會保證它會關閉嗎? – PositiveGuy 2010-02-15 20:14:37

+0

@coffeeaddict:是的 - 和放在'finally'塊中一樣(它保證'finally'內的任何內容都會運行,即使錯誤在'try'的某個地方拋出)。如果我沒有自己處理任何錯誤,我通常會使用'使用';如果我想捕獲一個異常,儘管(使用'catch'),我發現使用'try' /'catch' /'finally'而不是'try' /'''''''''''''''''更清潔 - 主要是因爲後者涉及更多層次的嵌套(當然,純粹是個人偏好)。 – 2010-02-15 20:59:14