是否可以在不关闭 .txt 的情况下使 StreamWriter 覆盖行?

Is it possible to make StreamWriter overwrite line without closing the .txt?

如果 StreamWriter 有像某些列表一样的自动更新输出:

Cute cat.
Angry dog.
Huge elephant.
Eternal sunshine.



1
2
3
4


如何强制 StreamWriter 在 one 行中写入此列表?狗覆盖猫,大象覆盖狗,阳光覆盖大象等等。因此我们可以看到 .txt 中只有一行发生变化,不是 console

所有 Console.() 偏差仅在 console 中解决了问题,但 .txt 文件不断收集新字符串。

具有讽刺意味的是,所有流可以做的是覆盖,这就是不可能得到你想要的东西的原因。

你真正想要的是 delete/insert 个字符,并让文件中的其余字节自行重新排列,但这不是流的工作方式(特别是基于磁盘的文件和网络 I/O 可以在流中间突然改变它们的长度)。

您有两种方法可以做到这一点:

  • 您按照所需的顺序将所需数据完全写入临时文件,然后删除旧文件并重命名临时文件以匹配旧文件的名称。
  • 你做的很到位。以附加方式打开流,读取您需要的内容,将指针移动到开头,一次写入所有内容然后关闭它(如果缩小它,请确保设置长度)。如果您的程序无法优雅地处理异常,则更容易出现数据损坏。或者你知道,停电。蓝屏。驱动程序崩溃。猫用爪子敲击 RAM 连接器。诸如此类。

类似于答案here你想在每次写入时重置文件流

public void OverwriteFile(Stream writer, string text) 
{
    writer.BaseStream.Seek(0,0);
    writer.BaseStream.SetLength(Encoding.UTF8.GetBytes(text).Length));
    writer.Write(text);
    writer.Flush();
}

写入完成后释放流。