簡體   English   中英

在StreamWriter.WriteLine()之后,FileStream.SetLength(0)不會清空文件

[英]After StreamWriter.WriteLine(), FileStream.SetLength(0) does not empty the file

我發現FileStream.SetLength(0)有一個奇怪的問題。 首先向流中寫入內容,然后調用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感到非常沮喪,因為一個問題被錯誤地標記為重復。 我花了一天的時間寫這個問題,他立刻決定是重復的,即使不是。 當那個家伙沒有真正理解問題並且不費心尋找正確答案時,通常會發生這種情況。 他只是覺得在SO上解決了類似的問題。 但是細節很重要。 是的,有一些關於使用SetLength(0)截斷文件的問題,但是它們在一個關鍵點上有所不同:在這些示例中,SetLength(0)之前沒有Write()。 但這是必不可少的,沒有它就沒有問題。

請將問題標記為重復來阻止其他人回答時,請非常小心和體貼。

在referencesource.microsoft.com上檢查FileStream.SetLength()時 ,我注意到這段看起來很有趣的代碼:

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

它在SetLength()內檢查內部FileStream緩沖區是否仍有寫內容,並在執行其余SetLength()之前先將其寫入文件。

一個非常奇怪的行為。 我可以通過先使用Flush()調用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中的錯誤?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM