C# 如何在向后读取文件后关闭该文件?

C# 如何在向后读取文件后关闭该文件?,c#,C#,不久前,我问了一个关于“如何使用C#中的迭代器反向读取文本文件”的问题 乔恩·斯基特为我提供了一个解决方案。但是我仍然有一个问题,在读取数据文件时如何关闭它?Jon似乎使用委托来处理迭代器,这非常有趣。但是,我如何调用“file.Close()”之类的函数来在处理文件时释放它呢 谢谢,当文件无法进一步读取时,Jon的代码调用了Dispose方法。 这就是你要找的吗 Dispose将调用Close&release文件句柄。当文件是坏流时,他调用Dispose public IEnumerator&

不久前,我问了一个关于“如何使用C#中的迭代器反向读取文本文件”的问题

乔恩·斯基特为我提供了一个解决方案。但是我仍然有一个问题,在读取数据文件时如何关闭它?Jon似乎使用委托来处理迭代器,这非常有趣。但是,我如何调用“file.Close()”之类的函数来在处理文件时释放它呢


谢谢,

当文件无法进一步读取时,Jon的代码调用了Dispose方法。
这就是你要找的吗


Dispose将调用Close&release文件句柄。

当文件是坏流时,他调用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);
    }
public IEnumerator GetEnumerator()
{
Stream=streamSource();
if(!stream.CanSeek)
{
stream.Dispose();
抛出新的NotSupportedException(“无法在流中查找”);
}
如果(!stream.CanRead)
{
stream.Dispose();
抛出新的NotSupportedException(“无法在流中读取”);
}
返回GetEnumeratorImpl(流);
}

但当我进行迭代时,它似乎并没有关闭文件。读取文件后,我试图做的是删除该文件。但我得到一个例外,说它被另一个进程使用。

这只是一个非常令人遗憾的疏忽

答案是——正常情况下——使用
尝试
/
最终
或使用
语句。这样,即使抛出异常,即使调用者没有一直迭代到文件的开头,文件也会关闭

但是,它确实依赖于调用方在
IEnumerator
上调用
Dispose
。幸运的是,这是由C#中的
foreach
循环自动处理的,但是如果您曾经明确地使用
GetEnumerator()
/
MoveNext()
/
Current
,那么您应该小心编写如下代码:

using (IEnumerator<string> iterator = foo.GetEnumerator())
{
    while (iterator.MoveNext())
    {
        string bar = iterator.Current;
        // etc
    }
}
使用(IEnumerator迭代器=foo.GetEnumerator())
{
while(iterator.MoveNext())
{
stringbar=iterator.Current;
//等
}
}
幸运的是,没有多少次需要这样做:)


在我的文章中,我有更多关于所有这些如何在封面下工作的细节,您可能会发现这些细节很有用。

最初,它只在不可查看/可读的情况下关闭流。现在,它也使用迭代器部分中的try/finally块来关闭它。