是否可以在不关闭 .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 处于非活动状态(可编辑 = 否)?