c# - 何时调用 File.Dispose()

标签 c# file dispose textwriter

我正在尝试使用文本编写器将文本写入 .NET Core 中的文件。以下代码不会向文件输出任何内容:

TextWriter writer = File.CreateText(@"...txt");
writer.Write("Hello World");

但是,这样做:

TextWriter writer = File.CreateText(@"...txt");
writer.Write("Hello World");
writer.Dispose();

这是为什么呢?这条额外的行告诉程序做什么不同的事情?我不想关闭 TextWriter,因为它会写入日志,而这些日志在我的应用程序运行时会持续且无限期地运行。

如何在应用程序停止运行之前保持打开状态?

更新

所以我想这样做的原因是我正在使用一个将其日志写入 TextWriter 的 SDK:

TextWriterLogger(textWriter);
//Creates a logger that writes to a TextWriter. User is responsible for providing an instance of TextWriter that is thread safe.

但是如果我只是将其包含在 using 语句中,则不会写入日志,因为在准备好写入日志时,using 语句将已执行并且 TextWriter 已被释放。

谢谢

最佳答案

Dispose 调用 Flush,它将缓冲区中存储的内部字节写入磁盘

如果不关闭或处置文件,您将留下非托管资源并可能锁定文件,更不用说内存泄漏了。而是始终使用 using 语句

using (TextWriter writer = File.CreateText(@"...txt"))
{
   writer.Write("Hello World");
}

但是如果你想连续写入文件,你将不得不刷新它

FileStream.Flush Method

Clears buffers for this stream and causes any buffered data to be written to the file.

TextWriter writer = File.CreateText(@"...txt");
...
writer.Write("Hello World");
...
writer.Flush(); // at this point the bytes are flushed to disk
...
...
writer.Dispose();

简而言之,大多数流都由内部数组(缓冲区)支持,因此您不会颠簸写入。默认大小为 4k,当它达到缓冲区大小时会自动刷新。如果你想看到立即写入,你必须每次都刷新它

最后,一些流具有自动刷新功能,可以为您完成这项工作

AutoFlush

Gets or sets a value indicating whether the StreamWriter will flush its buffer to the underlying stream after every call to Write(Char)

当你完成流时总是处理它

关于c# - 何时调用 File.Dispose(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54016413/

相关文章:

c# - 如何将控制台 C# 应用程序添加到 ASP.NET 网站?

c# - 正则表达式:删除除允许字符外的所有内容。如何?

c# - 重定向 cmd.exe 的输入/输出

PHP 创建随机 tmp 文件并获取其完整路径

javascript - 文本文件行与字符串 indexOf() 不匹配

c# - 获取区域设置 WinRT

JAVA 文件和图形流数据?

c# - 为类或接口(interface)声明 IDisposable?

c# - .NET 3.5 处理注册表项

c# - Datatable.Dispose() 会让它从内存中删除吗?