使用StreamWriter和FileStream写入txt文件

Leo*_*ger 23 c#

我使用的时候遇到了一些有趣的StreamWriterFileStream将文本追加到在.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.

  • 您永远不应该创建实现IDisposable的类型的匿名实例. (2认同)
  • 我不建议使用AutoFlush而不是处理对象.如果物体是一次性的,则应将其丢弃. (2认同)
  • @PhillipScottGivens这是真的,但依靠终结器并不是一个好习惯.你不知道它什么时候会运行,所以你不知道该资源将会存在多长时间. (2认同)

dtb*_*dtb 7

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

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

来自MSDN:

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

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