2017-05-11 3 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 \ rを\ NABC \ rを\ n" は

なり

明らかに、SetLength(0)を呼び出す前に書き込まれたとしても、123は削除されませんでした。

Seek()を使用するか、Positionを0に設定しても役に立たなかった。

私のアプリケーションでは、私は開いたままのファイルに書き込みます。時には、ファイルを完全に空にして別のコンテンツを書き込む必要が生じることがあります。パフォーマンス上の理由から、私はstreamWriterを閉じたくありません。誤って私は質問が重複として誤ってマークされてしまったことをStackOverflowの上に非常にイライラする経験をした重複

ような質問をマークするために愛するすべてのそれらの人に

注意。私は質問を書く日を過ごした。彼はそれが重複していると瞬時に判断する。これは、通常、その男が本当に質問を理解しておらず、正しい答えを見つけるのを煩わせることがない場合に発生します。彼はそれ以前に同様の問題が解決されたと感じています。しかし、詳細は重要です。はい、SetLength(0)を使用してファイルを切り詰めることについて質問がありますが、1つの重要な点で異なります。これらの例では、 はSetLength(0)の前にWrite()がありません。しかし、これは不可欠であり、問​​題がなければ問題ありません。

質問を重複して記入して他人の回答を妨害する場合は、十分に注意してください。

+0

StreamWriterは、基になるストリームを使いこなしていることを知りません。それはバッファそのものを持っているので、Flush()する必要があります。 –

+0

本当にクリアする方法は、新しいストリームとして閉じて再び開くことです。 – jdweng

+0

@jdweng:Flush()を使っている私の解決策はうまくいくように思えますが、問題が生じることはわかりません。それが何であるか説明できますか? –

答えて

1
FileStream.SetLength() on referencesource.microsoft.comを検査するとき、私はこのコードの面白い探し作品気づい

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

それは内部のFileStreamバッファはまだいくつかの書き込み内容を持っている場合()は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 \ rを\ n」は

私は聞いて興味がありますもしも他の人がこれがFileStreamのバグだと感じたら?

関連する問題