2012-02-13 89 views
3

我想寫入文本文件,但我有一個小問題。當使用下面的代碼時,它只寫一次。如何寫入文本文件,直到應用程序關閉

 StreamWriter fileWriter = new StreamWriter("test.txt"); 
     fileWriter.WriteLine(jointHead.Position.X);  
     fileWriter.Close(); 

當我寫這樣的:

 Debug.WriteLine(jointHead.Position.X); 

它,直到我關閉應用程序寫入的X位置。我如何寫入文本文件,如我在調試模式下寫入,直到關閉應用程序。如果我從它所在的位置取fileWrite.Close(),程序就不起作用。

謝謝...

+0

只需將相應的行更改爲:StreamWriter fileWriter = new StreamWriter(「test.txt」,true);附加到文件。 – FooLman 2012-02-13 13:39:36

+0

您的目標是追加文本,除非應用程序結束並將其寫入磁盤? – Oybek 2012-02-13 13:40:03

回答

1

嘗試

StreamWriter fileWriter = new StreamWriter("test.txt", true); 
     fileWriter.WriteLine(jointHead.Position.X);  
     fileWriter.Close(); 

這將允許寫入附加到文件末尾文本。 目前你每次都從頭開始寫作。

編輯

如果要清除文件的應用程序的啓動,然後只是執行以下操作:

StreamWriter fileWriter = new StreamWriter("test.txt"); 
      fileWriter.Write(""); 
      fileWriter.Close(); 
+0

謝謝,這工作,但它不寫。每次啓動應用程序時,是否有任何方法可以覆蓋? – Samet 2012-02-13 14:13:16

+0

新增瞭如何清除文件 - 基本上用空字符覆蓋文件並保存。 – ChrisBD 2012-02-13 15:05:07

+0

我不明白。我會同時使用兩種嗎?我的意思是,編輯verison將在應用程序的開始,我不保存任何東西。代碼的第一部分將在我想要保存的地方? – Samet 2012-02-13 16:20:44

0

的StreamWriter的的該構造將刪除test.txt的,如果它已經存在。所以每當這段代碼被執行時,它將刪除它之前創建的文件text.txt。相反,使用需要一個額外的布爾的overload for the constructor of streamwriter追加到現有的test.txt文件而不是替換它:

StreamWriter fileWriter = new StreamWriter("test.txt", true); 

或者,你可以用File.AppendAllLines方法去追加文本的文件。那麼你不必擔心關閉文件句柄,方法名稱本身就會清楚說明將會發生什麼。對我來說,這會更方便,不像重載的Streamwriter構造函數那樣晦澀難懂。

或者,您也可以使用日誌框架,如NLog。在這種情況下,NLog將負責所有的文件操作,因此您無需擔心。另外,你可以配置NLog來寫任何你喜歡的東西,比如你的文件,或者如你所說的,調試輸出窗口或者事件日誌等等,你也可以在任何文件操作上下注比你自己的實現更有效率。

2

從你的描述我假設你給出的代碼片段是在一個循環中。

通過在循環外部打開/關閉文件(這也可以解決您的問題),您可能會獲得更好的性能。

我真的想每次都打開/關閉文件,然後指定append標誌。

using (var fileWriter = new StreamWriter("test.txt", true)) 
{ 
    fileWriter.WriteLine(jointHead.Position.X); 
} 
0

保持流寫入器打開。但撥打WriteLine後致電Flush

或者,您可以打開文件進行追加,而不是爲每行重新創建文件。


您可能還想看看現有的日誌記錄框架。有許多現有的,不需要重新發明輪子。我個人會使用Common.Logging與您選擇的後端。

1

我寧願建議你使用某種記錄儀的使用一個stringbuilder。

public class Logger { 
    private StringBuilder sb; 
    public Logger() { 
     sb = new StringBuilder(); 
    } 
    public Log(String log) { 
     sb.Append(log).AppendLine(); 
    } 
    public void Flush() { 
     File.WriteAllText(String.Format(@"D:\Logs\Log at {0:yyyy-MM-dd HH:mm:ss}.txt", DateTime.Now), sb.ToString()); 
     sb.Clear(); 
    } 
} 

這個類是更優雅和可重用的解決方案。如果你的目標日誌不是很大,這是真的可以接受的。

相關問題