2016-04-05 174 views
0

我已經創建了一個fileStream和一個Streamwriter來寫入此文件。問題是我的文件沒有顯示任何文本。對象已正確實例化,路徑和所有內容都是寫入的,只是看不到任何寫入內容。也許是Streamwriter的問題?無法寫入文件流

public class Logger { 
     StreamWriter sw; 
     FileStream logFileStream; 

     public enum LogLevel 
     { 
      Low, 
      Medium, 
      High 
     }; 

     public Logger(string filePath) 
     { 
      //logStream = new StreamWriter(logFilePath, false); 
      logFileStream = new FileStream(filePath, FileMode.Open, FileAccess.Write); 
      sw = new StreamWriter(logFileStream); 
     } 

     public void LogMessage(string message) { 
      LogMessage(message, LogLevel.Low, false); 
     } 

     public void LogMessage(string message, LogLevel level, bool excludeFromLogFile){ 
      var prefix = string.Empty; 
      ConsoleColor color = ConsoleColor.White; 

      switch (level) 
      { 
       case LogLevel.Medium: 
        prefix = "?"; 
        color = ConsoleColor.Yellow; 
        break; 
       case LogLevel.High: 
        prefix = "!"; 
        color = ConsoleColor.Red; 
        break; 
      } 
      if (!excludeFromLogFile) 
      { 
       sw.WriteLine("{0} {1} {2}", prefix, DateTime.Now, message); 
      } 
      Console.ForegroundColor = color; 
      Console.WriteLine("{0}", message); 
      Console.ResetColor(); 
     } 

我實例化這個類,然後調用logger.LogMessage("poop", Logger.LogLevel.High, false);並沒有什麼表示。

由於

+0

你的記錄器類是保持'FileStream'和'海峽eamWriter'打開。數據通常不會被刷新,直到您調用「Dispose」。 – vesan

回答

2

的寫操作被緩衝在存儲器中,嘗試在每個登錄功能的結束主叫logFileStream.Flush();

你真的不應該在調用之間保持文件句柄打開,但如果我是你,我會在每個函數中打開和關閉它。如果你正在進行大量的日誌記錄,那麼將它自己緩存在內存中,並且一旦它達到一定的大小就將所有內容都轉儲出來。

+0

你是什麼意思在內存中緩衝它自己?至於在達到一定大小之前不要調用flush?我如何檢查緩衝區的大小? – user3519261

+0

一種選擇是將它寫入到'MemoryStream'中,然後使用StreamWriter寫入。 'Position'屬性會告訴你目前爲止你寫了多少,'GetBuffer()'會給你一個字節數組。或者,你可以使用'StringBuilder',在這種情況下'Length'會給你長度,ToString()會給你一個字符串。就個人而言,我會在大多數情況下使用MemoryStream。 –

1

這是正確的版本的例子

  • 使用自動沖洗的流作家=真
  • 在每個請求打開/關閉流 - 如果正確實施,自動沖洗是不必要的(沖洗會做後處理的StreamWriter)
  • 使用FileMode.Append
 
    public class Logger 
    { 
     public enum LogLevel 
     { 
      Low, 
      Medium, 
      High 
     }; 

     private readonly string _filePath; 

     public Logger(string filePath) 
     { 
      //logStream = new StreamWriter(logFilePath, false); 

      _filePath = filePath; 
     } 

     public void LogMessage(string message) 
     { 
      LogMessage(message, LogLevel.Low, false); 
     } 

     public void LogMessage(string message, LogLevel level, bool excludeFromLogFile) 
     { 
      using (var fileStream = new FileStream(_filePath, FileMode.Append, FileAccess.Write)) 
      { 
       using (var writer = new StreamWriter(fileStream) {AutoFlush = true}) 
       { 
        var prefix = string.Empty; 
        var color = ConsoleColor.White; 

        switch (level) 
        { 
         case LogLevel.Medium: 
          prefix = "?"; 
          color = ConsoleColor.Yellow; 
          break; 
         case LogLevel.High: 
          prefix = "!"; 
          color = ConsoleColor.Red; 
          break; 
        } 

        if (!excludeFromLogFile) 
        { 
         writer.WriteLine("{0} {1} {2}", prefix, DateTime.Now, message); 
        } 

        Console.ForegroundColor = color; 
        Console.WriteLine("{0}", message); 
        Console.ResetColor(); 
       } 
      } 
     } 
    }