【发布时间】:2018-02-11 12:32:02
【问题描述】:
我有 2 段代码。 看看这个。
static void Main(string[] args)
{
using (FileStream fs = new FileStream("temp.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
using (StreamWriter writer = new StreamWriter(fs))
{
writer.WriteLine("Hello World");
using (StreamReader reader = new StreamReader(fs))
{
Console.WriteLine(reader.ReadToEnd());
} // Line-1
} //Line-2 -> System.ObjectDisposedException: 'Cannot access a closed file.'
}
}
在第 2 行,我得到 System.ObjectDisposedException 发生。 为什么我会在此处出现此异常?
经过一番思考,我认为异常发生在第 2 行,因为与引用“fs”关联的流已经在第 1 行关闭。在第 2 行,它试图再次关闭同一个流。这个答案是有道理的。因此,我以为我找到了问题的正确答案,但后来我尝试了一些不同的方法。
现在看看这段代码。
static void Main(string[] args)
{
using (FileStream fs = new FileStream("temp.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
using (StreamReader reader = new StreamReader(fs))
{
Console.WriteLine(reader.ReadToEnd());
using (StreamWriter writer = new StreamWriter(fs))
{
writer.WriteLine("Hello World");
} // Line-1
} // Line-2 -> No Exception occurred.
}
}
在这段代码中,我没有遇到任何异常。即使我再次做同样的事情。在这里,与引用“fs”关联的流也已在 Line-1 关闭,并且它也在尝试在 Line-2 关闭流。
那么为什么我在这里没有得到任何异常?
我的问题与此不同 Is there any way to close a StreamWriter without closing its BaseStream? 因为我试图用第二个代码做同样的事情,尽管事实上(在第二个代码中) using 语句已经关闭了基本流( fs) 在第 1 行。我在 Line-2 中仍然没有任何异常。
因为@mjwills 和@evk 表示发生异常是因为在文件关闭后刷新流的内容。
我试过了。
static void Main(string[] args)
{
using (FileStream fs = new FileStream("temp.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite))
{
using (StreamWriter writer = new StreamWriter(fs))
{
writer.WriteLine("Hello World");
writer.Flush(); // Flushed the contents explicitly.
using (StreamReader reader = new StreamReader(fs))
{
Console.WriteLine(reader.ReadToEnd());
} // Line-1
} // Line-2 -> System.ObjectDisposedException: 'Cannot access a closed file.'
}
}
结果是一样的,即使我已经明确刷新了内容,我仍然有这个异常。请帮忙。
【问题讨论】:
-
问题不在多次关闭文件中。您可以在 FileStream 上多次调用 Close\Dispose ,而不会出现任何问题。但是您无法在文件关闭后读取\写入文件,其中包括将内容从缓冲区刷新到磁盘 - 这就是您的第一个示例中发生的情况(而在第二个示例中,第二次关闭时没有什么可写\读)。
-
我是说我已经尝试在进入 StreamReader 的 using 块之前刷新 writer。
-
@Evk 在进入 StreamReader 的 using 块之前,我明确地调用了刷新。
-
是的,但不同的是 -
StreamWriter无论如何都会尝试在关闭时刷新。当文件关闭时,这个尝试(即使真的没有什么要刷新的)被拒绝。另一方面,StreamReader不会尝试刷新任何内容(毕竟是读者)。