【问题标题】:C# .NET: Will a BinaryWriter flush when the FileStream buffer is filled?C# .NET:当 FileStream 缓冲区被填满时,BinaryWriter 是否会刷新?
【发布时间】:2011-10-05 12:51:12
【问题描述】:

我遇到了一些琐碎的事情,但是当我缓冲的数据达到 FileStream 缓冲区的大小时,数据似乎被刷新到磁盘(从 FileStream 的缓冲区中)。

//use the FileStream buffer to actually buffer the data to be written, so segments are written as desired.
FileStream writeStream = new FileStream(filename, FileMode.Append, FileAccess.Write, FileShare.None, CommandOperationBufferSize);
BinaryWriter binWriter = new BinaryWriter(writeStream);
byte[] FullSize = new byte[CommandOperationTotalSize];

//the BinaryWriter will flush when the FileStream buffer is hit
binWriter.Write(FullSize); //DATA FLUSHES TO DISK HERE!

//if wait, wait five seconds
if (CommandOperation == "writewait" || CommandOperation == "appendwait")
{
    Thread.Sleep(5000);
    writeStream.Flush();
    Thread.Sleep(5000);
}

writeStream.Close();
writeStream.Dispose();
binWriter.Close();

任何人都可以确认是这种情况吗?当 FileStream 的缓冲区被填满时,FileStream 的缓冲区是实际的 .Flush() 吗?

我之所以问,是因为如果我将 CommandOperationTotalSize 设置为 1MB,并将 CommandOperationBufferSize 设置为 64KB,则当缓冲区填满时,数据会刷新到磁盘。

听起来我回答了我自己的问题,但 FileStream 缓冲区不会溢出似乎很奇怪?但也许 API 开发人员试图变得友善?

谢谢,

马特

【问题讨论】:

  • API developers are trying to be nice :)
  • 我刚刚和一位 C++ 开发人员交谈过,是的,这就是我的想法。 :)

标签: c# .net stream filestream flush


【解决方案1】:

您可以很容易地假设缓冲区溢出是不可能的。如果是这种情况,该类将很难使用,因为 FileStream 根本没有属性来告诉您当前正在缓冲多少。

缓冲区仅用于减少对本机 Windows WriteFile() 调用的调用次数。当您写入少量数据时很重要,例如一次一个字节。如果您没有明确指定缓冲区大小,那么它将使用 4096 字节的缓冲区。这很好,非常很少需要其他东西。任何写入都由文件系统缓存进一步缓冲。使用 FileOptions.WriteThrough 时,您应该只考虑非标准大小

【讨论】:

  • 谢谢汉斯。我已经测试过,如果缓冲区已满,FileStream 似乎会调用 .Flush() ,但之前不会。我正在编写一个基准测试程序,并针对 SMB 上非常非常高的 I/O 进行基准测试,因此调整我拥有的任何缓冲区都是有用的(至少对于基准测试程序而言)。感谢您的回复。我想最好让缓冲区按预期工作。
  • 我用 ILSpy 看了一下 API 方法。
猜你喜欢
  • 2018-07-03
  • 2011-12-03
  • 2010-11-01
  • 1970-01-01
  • 2017-07-14
  • 2017-05-19
  • 1970-01-01
  • 2021-10-01
  • 1970-01-01
相关资源
最近更新 更多