【问题标题】:C# FileStream - Reader/Writer on a file, on a per line basis - Flush or FileLock?C# FileStream - 文件上的读取器/写入器,基于每行 - 刷新还是 FileLock?
【发布时间】:2014-05-09 09:18:31
【问题描述】:

我有一个带有 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() 之间的内容,因为它可能会部分损坏。

【问题讨论】:

  • 你用的是什么阅读器?流阅读器?
  • 阅读器应用未知,即有很多阅读器正在观看该文件。

标签: c# file filestream streamwriter


【解决方案1】:

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

我认为你有一个开放的流。 有一个作家和一个读者。 在刷新完成之前,读者不应阅读。

您需要使用在刷新调用后释放的手动锁定机制。 您可以实现内联,或者如果经常使用它,您可以创建一个线程安全的流。

【讨论】:

    猜你喜欢
    • 2013-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多