[英]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.