2017-05-11 9 views
0

FileStream.SetLength (0)에서 이상한 문제가 발견되었습니다. 스트림에 처음으로 뭔가를 작성하고 다음으로 SetLength를 호출 할 때 (0), 여전히 파일에 기록됩니다 이전 쓰기의 내용 :StreamWriter.WriteLine()을 실행 한 후 FileStream.SetLength (0)가 파일을 비우지 않습니다.

var fileName = "test.txt"; 
using (var fileStream = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read, 8000, FileOptions.None)) 
{ 
    using (var streamWriter = new StreamWriter(fileStream, Encoding.Default, bufferSize: 8000, leaveOpen: true)) 
    { 
     streamWriter.WriteLine("123"); 
     fileStream.SetLength(0); 
     streamWriter.WriteLine("abc"); 
    } 
} 
    var fileContent = File.ReadAllText(fileName); 

포함한 FileContent는 "123 \ 연구 \ NABC \ 연구 \ n"

된다

분명히, 123은 SetLength (0)을 호출하기 전에 작성된 경우에도 삭제되지 않았습니다.

Seek()를 사용하거나 Position을 0으로 설정하면 도움이되지 않았습니다.

내 응용 프로그램에서는 계속 열려있는 파일에 쓰고 있습니다. 때로는 파일을 완전히 비우고 다른 내용을 작성해야 할 수도 있습니다. 성능상의 이유로 streamWriter를 닫고 싶지 않습니다.

내가 질문이 중복으로 잘못 표시되어있어 것을 유래에 매우 실망 경험을했다 복제로 잘못 질문을 표시 사랑하는 모든 사람들에게

참고. 나는 질문을 쓰는 데 하루를 보냈다. 그는 그것이 순식간에 복제본이 아니라고 결정한다. 이것은 보통 그 사람이 질문을 진정으로 이해하지 못하고 정답을 찾지 않아도 발생합니다. 그는 전에 비슷한 문제가 해결되었다고 생각합니다. 그러나 세부 사항은 중요합니다. 예, SetLength (0)을 사용하여 파일을 잘라내는 것에 대한 질문이 있지만 한 가지 중요한 점에서 다릅니다. 이러한 예에서 SetLength (0) 앞에는 Write()가 없습니다. 그러나 이것은 필수적이며, 문제가 없다면 필수적입니다.

질문을 중복으로 표시하여 다른 사람들이 응답하지 못하게 할 때 매우 신중하고 신중하십시오.

+0

StreamWriter는 사용자가 기본 스트림을 어지럽히는지 여부를 알지 못합니다. 그것은 버퍼 자체를 가지고 있으며, 플러시()해야합니다. –

+0

정말로 깨끗하게하는 유일한 방법은 새 스트림으로 닫고 다시 여는 것입니다. – jdweng

+0

@jdweng : Flush()를 사용하는 내 솔루션이 작동하는 것 같습니다. 문제가 발생한다는 사실을 알지 못할 수도 있습니다. 그게 무엇인지 설명해 주시겠습니까? –

답변

1
FileStream.SetLength() on referencesource.microsoft.com을 검사 할 때, 나는이 코드 재미 찾고 조각 발견

:

 // Handle buffering updates. 
     if (_writePos > 0) { 
      FlushWrite(false); 
     } 

그것은 내부 파일 스트림 버퍼가 여전히 쓰기 내용이있는 경우() SetLength를 내 확인하고 실행하기 전에, 파일에 먼저 기록을 나머지 SetLength().

매우 이상한 행동입니다. 내가 먼저) 플러시 (사용) (SetLength를 호출하기 전에 내부 버퍼를 비우는하여이 문제를 해결할 수 :

var fileName = "test.txt"; 
    using (var fileStream = new FileStream(fileName, FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.Read, 8000, FileOptions.None)) { 
    using (var streamWriter = new StreamWriter(fileStream, Encoding.Default, bufferSize: 8000, leaveOpen: true)) { 
     streamWriter.WriteLine("123"); 
     streamWriter.Flush(); 
     fileStream.SetLength(0); 
     streamWriter.WriteLine("abc"); 
    } 
    } 
    var fileContent = File.ReadAllText(fileName); 

포함한 FileContent 지금 : "ABC \ 연구 \ n"

내가 듣고 관심을 가질 것 다른 사람들도 이것이 FileStream의 버그라고 생각한다면?