FileStream.Flush()和FileStream.Flush(True)之间有什么区别?

时间:2011-02-07 12:50:53

标签: c# .net filestream

MSDN表示FileStream.Flush(True)“也会清除所有中间文件缓冲区。”。

“所有中间文件缓冲区”究竟是什么意思?

3 个答案:

答案 0 :(得分:23)

它会将文件系统缓存中缓冲的文件数据写入磁盘。根据磁盘写头的位置,该数据通常是懒惰写入的。拥有一千兆字节的缓存数据在技术上是可行的,因此可能需要一段时间。如果这对您很重要,请考虑使用FileOptions.WriteThrough选项。它完全禁用写缓存。这可能非常昂贵;你会发现硬盘的速度有多慢。

答案 1 :(得分:5)

当您致电Flush()Flush(false)时,FileStream“将先前写入缓冲区的任何数据复制到文件中并清除缓冲区(编码器状态除外)”。这里的缓冲区表示FileStream类的内部缓冲区。并且复制到文件不会将数据写入光盘。它只是将数据传递给操作系统。

但是,Windows操作系统中的IO操作也会被缓冲 - 将数据写入磁盘可能会被推迟,直到系统准备就绪。因此,清除所有中间缓冲区会强制将缓冲数据写入光盘。这里的缓冲区意味着Windows内部缓冲区[文件系统缓存]。

BTW当您关闭文件时,所有缓冲的数据将自动写入光盘。因此,只有在文件句柄关闭之前需要刷新数据时才需要这些东西。

答案 2 :(得分:1)

这将进行额外调用以将缓冲区刷新到文件:

 Win32Native.FlushFileBuffers(this._handle);