2013-10-06 21 views
3

我想寫一個長長的數字列表到C#中的文件,但它在列表結束之前一直停止。例如下面的代碼:System.IO.StreamWriter不寫整個for循環

System.IO.StreamWriter file = new System.IO.StreamWriter("D:\\test.txt"); 

     for (int i = 0; i < 500; i++) 
     { 
      file.WriteLine(i); 
     } 

令我有一個文本文件中列出的數字0到431改變500至1000得到我0至840它只是似乎總是循環結束之前停止寫作。將數字輸出到控制檯以及文件已成功提供控制檯中的完整列表,但不是文件。

+1

作爲Windows用戶的提醒:**當您寫入流時,不要忘記刷新**。就像你去洗手間的時候,你把東西放在廁所裏一樣,你也沖洗,對吧? – Bitterblue

回答

11

您需要在退出程序之前關閉寫入程序,以確保將所有緩衝輸出寫入文件。

做的一個非常方便的方式與using語句,這保證了StreamWriter被關閉,一旦您的循環用它做:

​​
2

StreamWriter的緩衝,這意味着它不會寫每次你打電話給寫文件時

由於您自己沒有關閉StreamWriter,因此您依賴於對象的終結器來刷新緩衝區中剩餘的字節。

更改您的代碼以將StreamWriter放入using語句中,只要退出using塊,內容就會被刷新。

4

您發現StreamWriter使用緩衝區進行輸出,它的長度爲4096個字節。該緩衝區有助於提高效率,減少對操作系統WriteFile()函數的調用次數。確保緩衝區內容傳遞給文件需要調用Flush()方法或使用Close()或Dispose()關閉流。

如果你確定要繼續開,那麼你可以添加這行代碼的文件,以確保您可以看到輸出時,它寫的是:

file.AutoFlush = true; 

自動沖洗屬性默認false用於文件。對於控制檯它是true,這就是爲什麼你可以立即看到Console.Write/Line()的輸出。也是控制檯輸出太慢的原因之一。

但是,考慮到你的文件變量是一個局部變量,你幾乎肯定希望關閉文​​件。使用使用語句以確保在包含此代碼的方法返回時已處理此問題。忘記做這件事留下了一段時間的文件,至少直到下一次垃圾收集。