2016-04-05 3 views
0

Я создал файловый поток и потоковик, чтобы писать на это. Проблема в том, что мой файл не отображается ни с каким текстом. Объекты создаются правильно, и путь и все записываются, просто ничего не видно. Может быть, проблема с streamwriter?Не могу написать filestream

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' и Str eamWriter' открыт. Обычно данные не будут очищаться, пока вы не назовете «Dispose». – vesan

ответ

2

В записи в настоящее время в буферной памяти, попробуйте вызвать logFileStream.Flush(); в конце каждой функции Log.

Вы действительно не должны держать дескриптор файла открытым между вызовами, хотя, если бы я был вами, я бы открывал и закрывал его в каждой функции. Если вы выполняете много протоколирования, будьте аккуратно загружены в память и сбрасываете все это, когда достигнет определенного размера.

+0

Что вы имеете в виду, буферизуете себя в памяти? Как и в случае не называть флеш до тех пор, пока он не достигнет определенного размера? как я могу проверить размер буфера? – user3519261

+0

Один из вариантов - записать его в «MemoryStream», который вы затем пишете с помощью StreamWriter. Свойство 'Position' скажет вам, сколько вы уже написали, и' GetBuffer() 'даст вам массив байтов. В качестве альтернативы вы можете использовать 'StringBuilder', и в этом случае' Length' даст вам длину, а ToString() предоставит вам одну строку. Лично я использовал MemoryStream в большинстве случаев. –

1

Это правильная версия вашего примера

  • использование AutoFlush = истина в потоке писателя
  • открыть/закрыть поток в каждом запросе - если она правильно реализована, AutoFlush ненужно (вровень будет сделано после того, как распоряжаться 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(); 
       } 
      } 
     } 
    } 

 Смежные вопросы

  • Нет связанных вопросов^_^