2013-07-25 22 views
3

我現在正在開發一個允許編輯非常大的文本文件(4Gb +)的類。那麼它可能聽起來有點愚蠢,但我不明白我如何修改流中的文本。 這裏是我的代碼:修改FileStream

public long Replace(String text1, String text2) 
{ 
    long replaceCount = 0; 
    currentFileStream = File.Open(CurrentFileName, FileMode.Open, FileAccess.ReadWrite, FileShare.None); 

    using (BufferedStream bs = new BufferedStream(currentFileStream)) 
    using (StreamReader sr = new StreamReader(bs)) 
    { 
     string line; 
     while ((line = sr.ReadLine()) != null) 
     { 
      if (line.Contains(text1)) 
      { 
       line.Replace(text1, text2); 

       // Here I should save changed line 
       replaceCount++; 
      } 
     } 
    } 
    return replaceCount; 
} 
+0

對不起混了您的樣本(不寫任何東西)與伊赫桑烏拉」一個(這是使用'StringBuilder'這顯然不會幫助你與大文件)。刪除我的答案。 –

+0

這在一般情況下不起作用。只有在非常不尋常的情況下,更換的時間和原件一樣長。文件不允許在文件中間插入和刪除。因此需要完全重寫該文件。如果你有4個jiggabyte文本文件,那麼你做錯了。 –

+0

@HansPassant,4GB +文件不是操作的結果,但我處理現有的大文件... –

回答

0

您不打算裝在你的代碼的任何地方。您應該保存所有文本,然後再將其寫入文件。像,

public long Replace(String text1, String text2) 
{ 
    long replaceCount = 0; 
    currentFileStream = File.Open(CurrentFileName, FileMode.Open, FileAccess.ReadWrite, FileShare.None); 
StringBuilder sb = new StringBuilder(); 
using (BufferedStream bs = new BufferedStream(currentFileStream)) 
using (StreamReader sr = new StreamReader(bs)) 
{ 
    string line; 
    while ((line = sr.ReadLine()) != null) 
    { 
     string textToAdd = line; 
     if (line.Contains(text1)) 
     { 
      textToAdd = line.Replace(text1, text2); 

      // Here I should save changed line 
      replaceCount++; 
     } 
     sb.Append(textToAdd); 
    } 
} 
using (FileStream fileStream = new FileStream(filename , fileMode, fileAccess)) 
     { 
      StreamWriter streamWriter = new StreamWriter(fileStream); 
      streamWriter.Write(sb.ToString()); 
      streamWriter.Close(); 
      fileStream.Close(); 
     } 
return replaceCount; 

}

+0

無法保存所有文本,磁盤上沒有其他文件的空間,所以我只是想要找到如何在bs中替換已更改的行Stream –

+0

在寫入新文件之前,您可以刪除舊文件。 – Ehsan

+0

@SergiuCojocaru我不認爲這是可能的閱讀和寫在同一去。你必須閱讀,然後寫。 – Ehsan