2012-08-14 95 views
0

我有一個錯誤,無法寫入到一個封閉的TextWriter

「不能寫入到一個封閉的TextWriter。」

代碼:

public class Logs 
{ 
    static string File_Path= ""; 
    static public FileStream fs; 
    static public StreamWriter sw; 
    public static void Initialize(string path) 
    { 
     File_Path = path; 

     fs = new FileStream(File_Path, FileMode.Append, FileAccess.Write); 
     sw = new StreamWriter(fs); 
    } 
    public static void info_log(string msg) 
    {      
     sw.WriteLine("{0} [INFO] : {1}",DateTime.Now.ToString(),msg); 
     sw.WriteLine(" "); 
     sw.Close(); 
     sw.Flush(); 
    } 
    public static void error_log(Exception ex) 
    { 
     sw.WriteLine("{0} [ERROR] : {1}", DateTime.Now.ToString(), ex.Message); 
     sw.WriteLine("StackTrace : {0}:", ex.StackTrace); 
     sw.WriteLine(" "); 
     sw.Close(); 
     sw.Flush(); 
    } 
    public static void warning_log(string msg) 
    { 
     sw.WriteLine("{0} [WARNING] : {1}", DateTime.Now.ToString(), msg); 
     sw.WriteLine(" "); 
     sw.Close(); 
     sw.Flush(); 
    } 
} 
+0

你能給我們一個你調用這些方法的順序的例子嗎?因爲如果您在每次調用info_log,error_log或warning_log之前都未調用Initialize,則實際上您嘗試使用CLOSED StreamWriter進行編寫。您需要在任何WriteLine操作之前打開StreamWriter。 – 2012-08-14 10:51:31

+0

如果沒有調用初始化,那麼'sw'將是'null',導致NPE。 – afk5min 2012-08-15 05:59:13

回答

2

那麼,你是關閉的StreamWriter,然後每次寫入後刷新它。換句話說,你關閉了流,然後嘗試寫入它。

通常你會想初始化一次然後使用日誌記錄方法。寫完後只需要sw.Flush()。 (所以...刪除每個方法中的sw.Close())。但是,如果您的應用程序僅在一些非常罕見的情況下記錄消息,則應在每次調用之前初始化(因爲這種情況很少發生),並在刷新後關閉。這需要重新訂購sw.Flush()sw.Close()