C# - 随机写入文件 - 在第一行之前写入第二行

4

我正在尝试使用FileStream写入文件,并希望先写第二行,然后再写第一行。我使用Seek()在写完第二行后返回文件开头,并写入第一行。但它会替换第二行(或部分替换,具体取决于第一行的长度)。如何避免替换第二行?

        var fs = new FileStream("my.txt", FileMode.Create);
        byte[] stringToWrite = Encoding.UTF8.GetBytes("string that should be in the end");
        byte[] stringToWrite2 = Encoding.UTF8.GetBytes("first string\n");
        fs.Write(stringToWrite, 0, stringToWrite.Length);
        fs.Seek(0, SeekOrigin.Begin);
        fs.Write(stringToWrite2, 0, stringToWrite2.Length);

以下内容已写入文件:

first string
hould be in the end

I want it to be

first string
string that should be in the end

谢谢


当您寻找流的开头时,您正在设置要写入的位置。如果已经有数据存在,它将被覆盖。 - Russell Troywest
3个回答

4

首先,您需要查找文件中与第一个字符串长度相等的部分。

fs.Seek(stringToWrite2.Length, SeekOrigin.Begin);
fs.Write(stringToWrite, 0, stringToWrite.Length);
fs.Seek(0, SeekOrigin.Begin);

另外,不要忘记处理你的流(using)。


但我写这篇文章的原因是因为当我写第二个字符串时,我不知道第一个字符串(以及长度)是什么。 - manojlds
在这种情况下,您将不得不重新阅读您已经写过的内容,将其进一步写入文件中,然后编写放在前面的字符串。 - Talljoe
那很有道理。接受作为答案。 - manojlds

3

你不能在文件中插入并“推”回现有内容。你只能覆盖或扩展。

因此,在不知道其前面所有内容的情况下,你无法写入文件的一部分。


或者至少返回前面内容的长度。 - Svish

2

根据您想要实现的目标,您可能需要写入两个不同的文件,其中一个是临时文件。

  1. 创建一个带有“second”内容的临时文件
  2. 创建一个带有“first”内容的新文件
  3. 打开第一个文件,读取其内容并将其附加到第二个文件

如果这是更大解决方案中的一项重复需求,那么您可能需要某种类型的数据库?也许是基于文件的数据库,例如SqlLiteBerkeleyDb

类似的问题在此处讨论。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接