没有覆盖,是否可以从文本文件中删除字符串?

Without Overwriting, is it possible to remove string from a text file?

我正在尝试将一行附加到文本文件,但首先要删除封闭的括号。

下面是我的文本文件数据格式的样子

{
"1455494402": 8,
 "1456272000": 2,
 "1456358400": 1}

现在,当我追加文本文件时,数据应该如下所示

{
"1455494402": 8,
 "1456272000": 2,
 "1456358400": 1,
 "1454716800": 1,
 "1454803200": 4,
 "1454889600": 7,
 "1458345600": 17,
 "1458518400": 1 }

我认为有两种选择,

我认为第一个选项不太明智。

第二个选项很酷,但是如何在附加最新数据之前删除最后一个括号,我不能只用新数据替换 } 吗?

到目前为止,我的研究告诉我,再次写入文件是唯一更好的选择,你也这么认为吗?不能只是附加 ( 在某种意义上删除括号并附加 )

编辑:请不要认为这是重复的,我想知道第二个选项是否可行?但是我知道我可以使用上面详细信息中提到的第一个选项

假设:

  • 知道文件末尾会有一个大括号(或任何其他编码为单字节的字符),
  • 文件写成UTF8

然后你可以覆盖最后一个字符如下:

string filename = "test.txt";
File.WriteAllText(filename, "{One\nTwo\nThree}"); // Note curly brace at the end.

using (var file = new StreamWriter(File.OpenWrite(filename)))
{
    file.BaseStream.Position = file.BaseStream.Length - 1;
    file.Write("\nfour}"); // New line at end, previous brace is replaced.
}

然而,这非常脆弱。如果最后一个字符恰好是一个多字节编码的字符,那么这将不起作用。

很可能不值得你冒险,除非文件非常大并且你已经安排了时间表明值得引入这种脆弱的代码来加速它。

请注意,还可以通过更改传递给 StreamWriter() 构造函数的编码来修改此代码以使用 ASCII 或 ANSI 文件。