我問過一個關於「如何在C#中用迭代器反向讀取文本文件」的問題。 Please see the link如何在向後讀取文件後關閉文件?
Jon Skeet非常善良的爲我提供解決方案。但是,在讀取數據文件時如何關閉數據文件仍然存在問題?似乎Jon使用委託來處理迭代器,這非常有趣。但是如何在文件被處理時調用類似「file.Close()」的方法來釋放它?
感謝,
我問過一個關於「如何在C#中用迭代器反向讀取文本文件」的問題。 Please see the link如何在向後讀取文件後關閉文件?
Jon Skeet非常善良的爲我提供解決方案。但是,在讀取數據文件時如何關閉數據文件仍然存在問題?似乎Jon使用委託來處理迭代器,這非常有趣。但是如何在文件被處理時調用類似「file.Close()」的方法來釋放它?
感謝,
這只是一個非常遺憾的疏忽。
答案是 - 正常情況下 - 使用try
/finally
或using
聲明。這樣,即使拋出異常,即使調用者不會一直迭代到文件的開頭,文件也會被關閉。
但是,它確實依靠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的封面下工作,你可能會覺得有用。
喬恩的代碼有調用Dispose方法時,該文件不能被進一步閱讀。
這是你在找什麼?
配置將調用Close &釋放文件句柄。
當它是一個錯誤的流時,他稱爲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);
}
但是當我做迭代,它似乎並沒有關閉文件。讀取文件後我想要做的是刪除該文件。但是我得到了一個異常說它被另一個進程使用。
最初它只關閉流,如果它不可查找/可讀。它現在使用迭代器部分中的try/finally塊關閉它。 – 2009-02-24 07:05:46