- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个 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
将导致底层流被Flush
ed。 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/
StreamWriter.Flush() 和 StreamWriter.Close() 在功能上有什么区别? 当我的数据没有正确写入文件时,我将 Flush() 和 Close() 添加到我的代码末尾
我需要尽快写入许多文件,但我没有像我使用的那样使用 Streamwriter 获得我想要的结果。例如,如果我写... $File = "c:\somefile" $Contents = get-con
我正在尝试创建一个程序,将文本文件中的几行从文本框编辑为用户设置值。 至少,在我开始使用这个值设置之前。我什至无法编辑该文件。这段代码有什么问题?我实际上尝试了更多示例,但没有一个起作用。 priva
遇到一个问题,streamwriter 在我正在生成的 csv 中生成错误的字符。字符  只出现在文件的开头: 5,"GEN",555555555,,"Evan","Smith",,,,,
我正在尝试创建一个程序,从文本框中将文本文件中的几行编辑为用户设置的值。 至少,在我懒得开始这个值设置之前。我什至无法编辑文件。这段代码有什么问题?我实际上尝试了更多示例,但没有一个有效。 priva
关闭。这个问题需要debugging details .它目前不接受答案。 编辑问题以包含 desired behavior, a specific problem or error, and th
如何写入不同类的文件? public class gen { public static string id; public static string m_graph_file; } s
我正在使用 StreamWriter 类将一些文本写入新创建的文本文件,但输出总是出奇地错误,这是我的代码: StreamWriter sw = new StreamWriter("newtextfi
basicLog 是名称和时间戳的列表。我想将它们写入文件。我得到的两个错误是在 ';'在 StreamWriter 行和"file"上。在第二行。 ';'错误是:可能错误的空语句文件错误是:当前上下
这是我的代码。 : FileStream fileStreamRead = new FileStream(pathAndFileName, FileMode.OpenOrCreate, FileAcc
我已经初始化了 StreamWriter 实例并将其与“MyFile.txt”相关联 System.IO.StreamWriter sw = new StreamWriter("MyFile.txt"
我在字符串变量中有大量内容,我想使用流写入器将该内容写入文本文件。但是流编写器正在截断文本而不是将整个内容写入文件。为什么? using (StreamWriter sw = new StreamWr
我有一种方法可以将文件作为附件发送。我使用 StreamWriter 和 MemoryStream 来创建附件。代码如下: public void ComposeEmail(string from,
我试图每小时创建一个新的日志文件,并在服务器上运行以下代码。当天的第一个日志文件正在创建并写入正常,但当天没有创建更多的日志文件。任何想法可能出了什么问题?也不会抛出异常。 private void
我正在为我的游戏制作一个关卡编辑器,大部分工作正常,除了...当我尝试保存我的文件 (XML) 时,文件没有创建,在输出框中我得到: “System.NullReferenceException”类型
我在 form1 中有一个文本框和一个按钮,当我在文本框中书写时,我可以使用我的按钮将其保存到计算机上的文件中。这是放在我的按钮里面 public void button1_Click(obj
我目前的申请有问题,我开始认为这只是我的逻辑。即使浏览了这些表格和 MSDN,我也无法弄清楚。 我正在尝试使用 StreamWriter 在我的应用程序目录中创建文本文档并创建包含该文档的子文件夹。目
我组织了一个小类来实现一个快速记录器。我用一个在构造函数中实例化的私有(private) System.IO.StreamWriter 组成它。因为我使用的方式阻止我实现 using block ,所
我有一个使用此方法的 C# .NET 3.5 Windows 窗体程序: private void toLog(string sLog) { richTextBox1.
这里真的很迷茫。我正在运行 Windows 7 并使用管理员帐户,但由于某种原因,以下代码正在下降; public static readonly string Report = Path.Combi
我是一名优秀的程序员,十分优秀!