【发布时间】:2013-02-02 01:22:57
【问题描述】:
我在使用 StreamWriter 和 FileStream 将文本附加到 .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 起作用的地方失败了?
【问题讨论】:
-
我猜
StreamWriter在刷新之前实际上并没有 write 任何东西,它的Dispose方法通过与using块一起使用而被隐式调用会自动冲洗它。编辑:请注意StreamWriter有一个AutoFlush 属性,它可以控制这种行为,让它在你写的时候自动刷新流,我猜默认是false。 -
这已经被回答了,但是你为什么要这样格式化代码呢?阅读和理解 IMO 非常可怕,而且通过简单的格式错误引入错误的风险也会增加。我是牙套的忠实粉丝 - 永远!
-
@TheCodeKing 如果已经回答,您介意提供链接吗?我诚实地寻找它并在发布之前查看了每个建议的答案,但没有看到任何可以完全回答它的东西(主要是因为我使用了匿名函数。)另外,我不是在这里讨论最重要的事情部分风格和基于偏好。杂乱无章的大括号的 IMO 代码更难阅读。
-
@TheCodeKing 但我也在 Python 中做了很多工作,因此使用缩进来确定范围已成为第二天性。
-
这里提到msdn.microsoft.com/en-us/library/…,如果未设置 AutoFlush,则在关闭时刷新。当 Dispose 关闭流时,您需要显式调用 Dispose 或 Close 来刷新流。
标签: c#