我使用的时候遇到了一些有趣的StreamWriter与FileStream将文本追加到在.NET 4.5的现有文件(没有尝试过任何旧框架).我尝试了两种方法,一种方法有效,一种方式无效.我想知道两者之间有什么区别.
两种方法都在顶部包含以下代码
if (!File.Exists(filepath))
using (File.Create(filepath));
Run Code Online (Sandbox Code Playgroud)
我在using声明中创建了因为我通过个人经验发现它是确保应用程序完全关闭文件的最佳方法.
非工作方法:
using (FileStream f = new FileStream(filepath, FileMode.Append,FileAccess.Write))
(new StreamWriter(f)).WriteLine("somestring");
Run Code Online (Sandbox Code Playgroud)
使用此方法,最终不会将任何内容附加到文件中.
工作方式:
using (FileStream f = new FileStream(filepath, FileMode.Append,FileAccess.Write))
using (StreamWriter s = new StreamWriter(f))
s.WriteLine("somestring");
Run Code Online (Sandbox Code Playgroud)
我做了一些谷歌搜索,不知道要搜索什么,并没有找到任何信息.那么,为什么匿名StreamWriter失败的地方(非匿名?名字?)StreamWriter有效?
Phi*_*ens 20
听起来你没有冲洗流.
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.
两个代码片段之间的区别在于使用using.该using语句将对象置于块的末尾.
在将StreamWriter数据写入基础流之前缓冲数据.处理StreamWriter冲洗缓冲区.如果不刷新缓冲区,则不会写入任何内容.
来自MSDN:
您必须调用Close以确保所有数据都正确写入基础流.
另请参阅:我何时应该在C#中使用"使用"块?