2013-07-25 8 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'을 사용 에산 Ullah '한 (과 샘플 (즉, 전혀 아무것도 기록하지 않습니다) 혼합). 내 대답을 삭제합니다. –

+0

일반적인 경우에는 작동하지 않습니다. 매우 예외적 인 경우에만 대체품이 원본과 정확히 일치 할 때만 가능합니다. 파일은 파일의 중간에 삽입 및 삭제를 허용하지 않습니다. 따라서 파일을 완전히 다시 작성해야합니다. 4GB의 텍스트 파일을 가지고 있다면 잘못 처리하고있는 것입니다. –

+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 스트림에서 변경된 행을 대체하는 방법을 찾고 싶습니다. –

+0

새 파일을 작성하기 전에 이전 파일을 삭제할 수 있습니다. – Ehsan

+0

@SergiuCojocaru 나는 ​​같은 방향으로 읽고 쓰는 것이 가능하다고 생각하지 않는다. 읽고 쓰고해야합니다. – Ehsan