2011-04-17 86 views
4

我正在尝试使用FileStream写入一个文件,并且希望写入第二行然后写入第一行。在写完第二行之后,我使用Seek()返回到开头,然后写入第一行。它取代了第二行(或者取决于第一行的长度,它的一部分)。我怎样才能不取代第二行?C# - 随机写入文件 - 在第一行之前写入第二行

 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 

我想这是

first string 
string that should be in the end 

感谢

+0

当您寻求流的开始时,您正在设置您要写入的位置。如果数据已经存在,它将被覆盖。 – 2011-04-17 10:12:00

回答

4

首先需要寻求到文件等于长度的第一个字符串。

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

此外,不要忘记处理您的流(using)。

+0

但是我写这么写的原因是因为当我写第二个字符串时,我不知道第一个字符串(也就是长度) – manojlds 2011-04-17 10:15:50

+0

在这种情况下,您必须重新读取您已经写入的内容,再次写入它进一步写入文件,然后写入前面的字符串。 – Talljoe 2011-04-17 10:29:04

+0

这很有道理。接受为答案。 – manojlds 2011-04-17 10:30:28

3

您无法插入到文件中,并且推回到现有内容。你只能覆盖或扩展。

因此,只有在知道所有先于它的内容之后,才能写出该文件的一部分。

+0

或至少是前面内容的长度。 – Svish 2012-04-20 12:41:58

2

根据您要达到的目标,您可能需要写入两个不同的文件,一个是临时文件。

  1. 与“第二”的内容创建一个临时文件
  2. 与“第一”的内容
  3. 打开的第一个文件创建一个新文件,阅读其内容,并追加到第二个文件

如果这是一个更大的解决方案中反复出现的需求,也许你想要的是某种数据库?可能是基于文件的数据库,如SqlLiteBerkeleyDb

讨论了类似的问题here