2016-04-05 132 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(); 
       } 
      } 
     } 
    }