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

时间:2015-03-13 18:30:14

标签: c# streamwriter overwrite

如果StreamWriter有一个自动更新输出,如某些列表:

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



1
2
3
4


如何强制StreamWriter在一个行中编写此列表?狗覆盖猫,大象覆盖狗,阳光覆盖大象等。因此,我们可以看到.txt中只有一行更改,不是控制台

所有控制台。()偏差解决了仅限控制台中的问题,但.txt文件会依次收集新字符串。

2 个答案:

答案 0 :(得分:1)

与答案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();
}

完成写入后,请处理流。

答案 1 :(得分:0)

具有讽刺意味的是,可以做的所有流都会被覆盖,这就是无法获得所需内容的原因。

你真正想要的是删除/插入字符,并让文件中的其余字节重新排列,但这不是流的工作原理(特别是基于磁盘的文件和网络I / O都不会突然改变它们在溪流中间的长度)。

您有两种方法:

  • 您可以按所需顺序完整地写入所需数据的临时文件,然后删除旧文件并重命名临时文件以匹配旧文件的名称。
  • 你做到了。打开流作为追加,读取你需要的东西,将指针移动到开头,一次写下然后关闭它(确保缩小它的长度)。如果您的程序无法正常处理异常,则更容易出现数据损坏。或者你知道,停电。蓝屏。司机崩溃了。猫用爪子敲击RAM连接器。那种事。