使用StreamWriter和FileStream写入txt文件

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

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

 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工作的地方失败了?

听起来你没有冲洗流。

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,而StreamWriter必须依次调用Flush。

两个代码片段之间的区别在于usingusing语句将对象放在块的末尾。

StreamWriter在将数据写入基础流之前缓冲数据。 处理StreamWriter刷新缓冲区。 如果不刷新缓冲区,则不会写入任何内容。

来自MSDN :

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

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