24

StreamWriter在 .NET 4.5 中使用a将文本附加到现有文件时,我遇到了一些有趣的事情FileStream(没有尝试过任何较旧的框架)。我尝试了两种方法,一种有效,一种无效。我想知道两者之间的区别是什么。

两种方法都在顶部包含以下代码

if (!File.Exists(filepath))
    using (File.Create(filepath));

我在using声明中创建了该文件,因为我通过个人经验发现这是确保应用程序完全关闭文件的最佳方式。

非工作方式:

using (FileStream f = new FileStream(filepath, FileMode.Append,FileAccess.Write))
    (new StreamWriter(f)).WriteLine("somestring");

使用这种方法,最终不会将任何内容附加到文件中。

工作方法:

using (FileStream f = new FileStream(filepath, FileMode.Append,FileAccess.Write))
    using (StreamWriter s = new StreamWriter(f))
        s.WriteLine("somestring");

我做了一些谷歌搜索,不知道要搜索什么,也没有找到任何有用的信息。那么,为什么匿名StreamWriter在(非匿名?命名?)StreamWriter工作的地方失败?

4

2 回答 2

21

听起来您没有刷新流。

http://msdn.microsoft.com/en-us/library/system.io.stream.flush.aspx

看起来 StreamWriter 在写入最终目的地之前写入缓冲区,在本例中为文件。您还可以设置 AutoFlush 属性,而不必显式刷新它。

http://msdn.microsoft.com/en-us/library/system.io.streamwriter.autoflush.aspx

要回答您的问题,当您使用“使用”块时,它会调用 StreamWriter 上的 dispose,而后者又必须调用 Flush。

于 2013-02-02T01:34:12.773 回答
7

两个代码片段之间的区别在于使用using. using语句将对象放置在块的末尾。

AStreamWriter在将数据写入底层流之前对其进行缓冲。处理StreamWriter刷新缓冲区。如果您不刷新缓冲区,则不会写入任何内容。

来自MSDN

您必须调用 Close 以确保所有数据都正确写入底层流。

另请参阅:我什么时候应该在 C# 中使用“使用”块?

于 2013-02-02T01:30:20.463 回答