即使使用AutoFlush,StreamWriter也会留下一半写入的行

时间:2014-03-29 19:26:39

标签: c# streamwriter

我有一个带有AutoFlush = true属性的StreamWriter。但是,当我随机打开它时,我仍然看到文件只是部分写入。我在任何给定的时间内写了一个需要完全写入(JSON)的文件。

        var sw = new StreamWriter("C:\file.txt", true /* append */, Encoding.ASCII) { AutoFlush = true };
        sw.WriteLine("....");

        // long running (think like a logging application) -- 1000s of seconds

        sw.Close();

在sw.WriteLine()调用和sw.Close()之间,我想打开文件,并始终使用正确的数据格式",即我的行应该是完整的。

当前的想法:

增加FileStream(和/或StreamWriter)的内部缓冲区,让它们说128KB。然后每128KB-1,在FileStream对象上调用.Flush()。这引出了我的下一个问题,当我调用Flush()时,我应该在调用它之前获取Stream.Position并执行File.Lock(Position,128KB-1)吗?或者Flush会照顾好吗?

基本上我不希望读者能够阅读Flush()之间的内容,因为它可能会被部分破坏。

3 个答案:

答案 0 :(得分:1)

using (StreamWriter sw = new StreamWriter("FILEPATH"))
{
  sw.WriteLine("contents");
  // if you open the file now, you may see partially written lines
  // since the sw is still working on it.
}

// access the file now, since the stream writer has been properly closed and disposed.

答案 1 :(得分:0)

如果您需要一个永远不会半写入的“类似日志”的文件,那么方法就是不要保持打开状态。

每次您要写入文件时,都应实例化一个新的FileWriter,它将在释放文件时刷新文件内容,如下所示:

private void LogLikeWrite(string filePath, string contents)
{
  using (StreamWriter streamWriter = new StreamWriter(filePath, true)) // the true will make you append to the file instead of overwriting its contents
  {
    streamWriter.Write(contents);
  }
}

这样,您的写操作将立即被刷新。

答案 2 :(得分:0)

如果要在进程之间共享文件,除非您产生某种类型的锁定机制,否则您将处于竞争状态。参见https://stackoverflow.com/a/29127380/892327。这确实要求您能够同时修改两个过程。

一种替代方法是让进程A在指定位置等待文件。进程B写入中间文件,并且B刷新后,该文件被复制到进程A期望该文件所在的位置,以便可以使用该文件。