2009-02-24 67 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); 
    } 

但是当我做迭代,它似乎并没有关闭文件。读取文件后我想要做的是删除该文件。但是我得到了一个异常说它被另一个进程使用。