2011-04-17 87 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