2013-07-25 2 views
3

Я сейчас работаю над классом, который позволит редактировать очень большие текстовые файлы (4Gb +). Это может показаться немного глупым, но я не понимаю, как изменить текст в потоке. Вот мой код:Modify 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

извините перепутали ваш образец (что делает вообще ничего не писать) с одним Ehsan Улла»(который использует' 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