是否可以在不关闭 .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();
}
写入完成后释放流。
如果 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();
}
写入完成后释放流。