C# 使用StreamWriter和FileStream写入txt文件

C# 使用StreamWriter和FileStream写入txt文件,c#,C#,我在使用StreamWriter和FileStream将文本附加到.NET4.5中的现有文件时遇到了一些有趣的事情(没有尝试过任何旧的框架)。我尝试了两种方法,一种有效,一种无效。我想知道这两者的区别是什么 两个方法的顶部都包含以下代码 if (!File.Exists(filepath)) using (File.Create(filepath)); 我使用语句创建了,因为我通过个人经验发现,这是确保应用程序完全关闭文件的最佳方式 非工作方法: using (FileStream f

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

两个方法的顶部都包含以下代码

if (!File.Exists(filepath))
    using (File.Create(filepath));
我使用语句创建了
,因为我通过个人经验发现,这是确保应用程序完全关闭文件的最佳方式

非工作方法:

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");
使用此方法,不会向文件追加任何内容

工作方法:

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

这两个代码片段之间的区别在于使用
using
。在块的末尾处理对象

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

发件人:

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


另请参见:

听起来您没有刷新流

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


为了回答您的问题,当您使用“using”块时,它会调用StreamWriter上的dispose,它必须依次调用Flush。

我猜
StreamWriter
在Flush之前实际上不会写任何东西,它的
Dispose
方法通过与
using
块一起使用隐式调用,将自动刷新它。编辑:请注意,
StreamWriter
有一个属性,它可以控制这种行为,让它在您编写时自动刷新流,我猜默认情况下是
false
。这已经得到了回答,但为什么要这样格式化代码?阅读和理解IMO是可怕的,通过简单的格式错误引入错误的风险也会增加。我是牙套的超级粉丝——永远@代码如果已经被回答,你介意提供一个链接吗?在发布之前,我认真地查找了它,并查看了每一个建议的答案,但没有看到任何答案(主要是因为我使用了匿名函数)。此外,我在这里不是为了讨论大部分风格和偏好的问题。IMO代码中乱放着实际上不需要的大括号,阅读起来比较困难。@代码编写,但我也用Python做了很多工作,所以使用缩进来确定范围已经成为第二天性。这里提到,如果没有设置自动刷新,刷新将在关闭时发生。当Dispose关闭流时,您需要调用Dispose或显式关闭来刷新流。这不是一件痛苦的事,因为我或多或少已经假设了这一点,但是您是否可以添加一些参考,以使我可以在线查找此信息?这对其他人的好处和对我自己的好处一样多。你永远不应该创建实现IDisposable的匿名类型实例。我不建议使用自动刷新和不处理对象。如果一件物品是一次性的,它应该被处理掉。我同意所有的评论说你应该总是处理一次性物品。另外,我想回复Leon的try-and-see评论,并说除非明确要求处理对象,否则永远不会处理对象。然而,如果他们有一个终结器,他们就是终结的。@Phillips Cottgivens这是真的,但是依赖终结器不是一个好的实践。你不知道它什么时候运行,所以你不知道这个资源会存在多长时间。@Phillips Cottgivens在这么长时间后没有尝试把它带回来,但我今天重新阅读了这个问题,发现当使用
初始化
StreamWriter
时,实际上可以设置
自动刷新
(新StreamWriter(f){AutoFlush=true}).WriteLine(“somestring”)
仍然不是最佳实践,但它是另一个可行且有效的解决方案。