C# NET:当FileStream缓冲区被填满时,二进制编写器会刷新吗?

C# NET:当FileStream缓冲区被填满时,二进制编写器会刷新吗?,c#,.net,stream,filestream,flush,C#,.net,Stream,Filestream,Flush,我遇到了一些琐碎的事情,但当我正在缓冲的数据达到文件流缓冲区的大小时,数据似乎被刷新到磁盘(从文件流的缓冲区中) //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, F

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

//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();
有人能证实这一点吗?当文件流的缓冲区被填满时,文件流的缓冲区是否为实际的.Flush()

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

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

谢谢


Matt

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


缓冲区仅用于减少对本机Windows WriteFile()调用的调用数。重要信息:当您写入少量数据时,请一次写入一个字节。如果没有明确指定缓冲区大小,则它将使用4096字节的缓冲区。这很好,很少需要其他东西。任何写入操作都会由文件系统缓存进一步缓冲。在使用FielOpTest.WraveTrime

<代码> API开发人员试图做一个不错的< /C> >:我刚才和C++的DEV进行了交流,是的,这就是我的想法。谢谢你,汉斯。我已经测试过了,如果缓冲区已满,FileStream似乎会调用.Flush(),但之前不会。我正在编写一个基准测试程序,针对SMB上非常高的I/O进行基准测试,因此调整我拥有的任何缓冲区都是有用的(至少对于基准测试程序而言)。谢谢你的回复。我认为最好允许缓冲区按预期的方式工作。我使用ILSpy查看了API方法。