gpt4 book ai didi

c# - StreamWriter.Flush() 也会调用 FileStream.Flush() 吗?

转载 作者:太空狗 更新时间:2023-10-29 18:22:43 34 4
gpt4 key购买 nike

我有一个 StreamWriter,它的底层流是一个 FileStream。以下代码是否保证 FileStream 也将其缓冲区刷新到文件系统上的实际文件中,还是我需要在 上显式调用 Flush()文件流?

using (var fs = new FileStream("blabla", FileMode.Append)) {
using (var sw = new StreamWriter(fs)) {
sw.WriteLine("Hello, I want to be flushed.");
sw.Flush(); //I need this to also flush onto the file, not just to the FileStream
}
}

根据 MSDN ,“刷新流不会刷新其底层编码器,除非您明确调用 Flush 或 Close”,但我不知道 FileStream 是否可以被视为“底层编码器”。

此外,如果我不指定 FileOptions.WriteThrough,我是否保证操作系统最终会将刷新的行写入磁盘,即使程序在两个流关闭之前崩溃(例如假设没有 使用 {} block ,只调用 Flush())?

在我的场景中,我需要让流保持打开状态(用于日志记录),所以我不能使用 using {} block ,但我想确保数据始终写入磁盘,即使程序崩溃。如果电源关闭并且操作系统没有刷新到磁盘上,我可以承受丢失数据,但否则我需要操作系统最终刷新,即使我从未在流上正确调用 Close() .

最佳答案

是的,在StreamWriter 上调用Flush 将导致底层流被Flushed。 4.5 版本调用了一个私有(private)的Flush(bool,bool) 函数,其结尾为:

if (flushStream)
{
this.stream.Flush();
}

其中flushStream是第一个参数,this.stream是构造StreamWriter的流,中的调用>Flush()Flush(true,true)


(答案的较旧部分 - 我在回答时非常迂回。将答案中最相关的部分移至顶部)

它没有在我能找到的任何地方的文档中明确说明,但是通过将另一个流传递给它而构造的任何流类都应该被假定为“取得该流的所有权”(除非另有特别说明)。

也就是说,一旦您使用 fs 构建了 StreamWriter,您就不应该自己对 fs 执行任何直接操作。


你从MSDN引用的部分与后面的句子有关:

This allows the encoder to keep its state (partial characters) so that it can encode the next block of characters correctly. This scenario affects UTF8 and UTF7 where certain characters can only be encoded after the encoder receives the adjacent character or characters.

也就是说,您可能已经将数据传递给 Write,这样您就给了它一些 Unicode 代理项,但不是完整的字符。 Flush 不会将这些代理项写入流。只要您始终将格式良好(完整)的字符串传递给 Write,您就无需担心这一点。


关于c# - StreamWriter.Flush() 也会调用 FileStream.Flush() 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13043706/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com