2009-02-24 63 views
0

我問過一個關於「如何在C#中用迭代器反向讀取文本文件」的問題。 Please see the link如何在向後讀取文件後關閉文件?

Jon Skeet非常善良的爲我提供解決方案。但是,在讀取數據文件時如何關閉數據文件仍然存在問題?似乎Jon使用委託來處理迭代器,這非常有趣。但是如何在文件被處理時調用類似「file.Close()」的方法來釋放它?

感謝,

回答

2

這只是一個非常遺憾的疏忽。

答案是 - 正常情況下 - 使用try/finallyusing聲明。這樣,即使拋出異常,即使調用者不會一直迭代到文件的開頭,文件也會被關閉。

但是,它確實依靠IEnumerator<T>調用Dispose來電。好在多數民衆贊成在C#中foreach循環自動處理,但如果你曾經使用GetEnumerator()/MoveNext()/Current明確的,你要小心,寫這樣的代碼:

using (IEnumerator<string> iterator = foo.GetEnumerator()) 
{ 
    while (iterator.MoveNext()) 
    { 
     string bar = iterator.Current; 
     // etc 
    } 
} 

幸運的是有沒有很多時候你需要做到這一點:)

我已經得到了更多的細節,所有這些如何在我的iterator implementation article的封面下工作,你可能會覺得有用。

0

喬恩的代碼有調用Dispose方法時,該文件不能被進一步閱讀。
這是你在找什麼?

配置將調用Close &釋放文件句柄。

+0

最初它只關閉流,如果它不可查找/可讀。它現在使用迭代器部分中的try/finally塊關閉它。 – 2009-02-24 07:05:46

0

當它是一個錯誤的流時,他稱爲Dispose。

public IEnumerator<string> GetEnumerator() 
    { 
     Stream stream = streamSource(); 
     if (!stream.CanSeek) 
     { 
      stream.Dispose(); 
      throw new NotSupportedException("Unable to seek within stream"); 
     } 
     if (!stream.CanRead) 
     { 
      stream.Dispose(); 
      throw new NotSupportedException("Unable to read within stream"); 
     } 
     return GetEnumeratorImpl(stream); 
    } 

但是當我做迭代,它似乎並沒有關閉文件。讀取文件後我想要做的是刪除該文件。但是我得到了一個異常說它被另一個進程使用。