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

Posted

技术标签:

【中文标题】是否可以在不关闭 .txt 的情况下使 StreamWriter 覆盖行?【英文标题】:Is it possible to make StreamWriter overwrite line without closing the .txt? 【发布时间】:2015-05-16 08:41:50 【问题描述】:

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

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

1
2
3
4

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

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

【问题讨论】:

没有。关键字是。您将不得不重写文件。 TextWriter 能解决问题吗? 看这里的答案***.com/questions/8288401/… 您可以通过BaseStream 访问底层流并将其位置和长度设置为0(在FileStream 上使用SetLength)。 @Steve Mitcham 不幸的是,由于 Blindy 的回答,这并不能解决我的问题。还是谢谢! 【参考方案1】:

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

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

您有两种方法:

您按照您想要的顺序完全用您想要的数据编写一个临时文件,然后删除旧文件并重命名临时文件以匹配旧文件的名称。 你在原地做。以追加方式打开流,读取所需内容,将指针移到开头,一次全部写入然后关闭它(如果缩小它,请确保设置长度)。如果您的程序无法优雅地处理异常,则更容易出现数据损坏。或者你知道,停电。蓝屏。司机撞车。猫用爪子敲击 RAM 连接器。那种东西。

【讨论】:

天哪……还是谢谢=(【参考方案2】:

类似于答案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();

在完成写入后释放流。

【讨论】:

以上是关于是否可以在不关闭 .txt 的情况下使 StreamWriter 覆盖行?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在不重新编译的情况下使科尔多瓦应用程序可调试?

是否可以在不隐藏键盘的情况下使 UITextView 处于非活动状态(可编辑 = 否)?

是否可以在没有 BackgroundWorker 的情况下使 WinForms 响应? [关闭]

如何在不显式导入的情况下使新的装饰器在类中可用?

如何在不使用滤镜的情况下使图像变暗? [复制]

如何在不需要额外点击的情况下使 DataGridCheckBoxColumn 可编辑?