2013-05-16 86 views
0

我正在使用StraemWriter將文本消息記錄到日誌文件中。如果日誌文件不存在,則應創建該日誌文件,如果文件創建日期少於給定時間,則附加到日誌文件,或者在該日期之前創建該日誌文件。我使用下面StreamWriter不寫數據

public static class LogIt 
{ 
    private const string LOG_FNAME = @"Logfile.log"; 

    public static void WriteMsg(string msg) 
    { 
     bool append = true; 
     if (File.Exists(LOG_FNAME)) 
     { 
      //DateTime delDate = DateTime.Now.AddDays(-1); 
      DateTime delDate = DateTime.Now.AddMinutes(-30); 
      DateTime fileCreatedDate = File.GetCreationTime(LOG_FNAME); 
      if (DateTime.Compare(fileCreatedDate, delDate) < 0) 
      { 
       Console.WriteLine("DELETE FILE"); 
       File.Delete(LOG_FNAME); 
      } 
     } 

     using (StreamWriter sw = new StreamWriter(LOG_FNAME, append)) 
     { 
      sw.WriteLine(msg); 
     } 

     Console.WriteLine(msg); 
    } 
} 

類/代碼此類用於由它運行每隔x分鐘的任務計劃程序運行一個簡單的控制檯應用程序。

消息的寫法如下:

LogIt.WriteMsg("Log this message"); 

的消息顯示,當該文件最初但創建時的文件創建日期是過去刪除日期,創建該文件,但沒有後續消息文件永遠寫入文件。

任何想法爲什麼?

+1

試過調試了嗎? – Renan

+0

我轉載了你的代碼,它工作正常,你確定問題不在別的地方嗎? –

+0

@Renen,我已經通過代碼並使用console.writeline輸出消息,程序似乎工作,但是當文件被刪除,然後創建sw.Writeline不會寫文本只是一個emtpy文件存在。 – MPD

回答

0

@MPD沒問題。以下是我建議的解決方法的實施。試一試,讓我知道如果這有效。

private const string LOG_FNAME = @"Logfile.log"; 

     public static void WriteMsg(string msg) 
     { 
      bool deleted = false; 
      bool append = true; 
      if (File.Exists(LOG_FNAME)) 
      { 
       //DateTime delDate = DateTime.Now.AddDays(-1); 
       DateTime delDate = DateTime.Now.AddMinutes(-30); 
       DateTime fileCreatedDate = File.GetCreationTime(LOG_FNAME); 
       if (DateTime.Compare(fileCreatedDate, delDate) < 0) 
       { 
        Console.WriteLine("DELETE FILE"); 
        File.Delete(LOG_FNAME); 

        //record that file was deleted and a new one will be created 
        deleted = true; 
       } 
      } 

      using (StreamWriter sw = new StreamWriter(LOG_FNAME, append)) 
      { 

       sw.WriteLine(msg); 

      } 

      if (deleted) 
      { 
       //a new file is created. Make sure the creation time is set 
       FileInfo fi = new FileInfo(LOG_FNAME); 
       fi.CreationTime = DateTime.Now; 
      } 

      Console.WriteLine(msg); 
     } 
1

出於某種原因,即使文件在刪除後被重新創建,該文件也具有創建日期(首次創建具有該路徑的文件)作爲創建日期。您可以檢查文件屬性並查看日誌文件創建日期始終相同。解決方法是在重新創建文件時更新代碼中的文件創建日期。您可以使用FileInfo類。

+0

[This](http://msdn.microsoft.com/en-us/library/system.io.file.getcreationtime.aspx)MSDN條目解釋了NTFS如何緩存這些信息。 –

+0

@Rukshan Perera感謝您提供的信息,但我可以使用f文件重新創建,但任何後續的流寫入都不會出現。我將添加代碼來迎合這一點,但我不確定這是導致缺失寫入的原因。也感謝MSDN鏈接500-內部.. – MPD

+0

@MPD沒問題。以下是我建議的解決方法的實施。試一試,讓我知道如果這工作。 –

0

我想你在Windows 2003(或者XP)上運行這個代碼。如果是這樣的話:當你在時間T1在某個目錄中創建一個文件並刪除它,然後重新創建它;驚喜它有T1作爲創造日期!

我知道這只是因爲我在Windows 2003上遇到同樣的問題!

順便說一句我現在使用NLog和(恕我直言)它是完美的,並擁有我需要的一切。