2016-04-05 22 views
0

Buna yazmak için bir fileStream ve bir streamwriter oluşturdum. Sorun dosyamın herhangi bir metinle gösterilmemesi. Nesneler doğru bir şekilde oluşturuldu ve yol ve her şey yazılıyor, sadece bir şey yazmıyor. Belki de yazarla ilgili bir sorun mu var?Filestream'e yazamıyor

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(); 
     } 

ben bu sınıfı başlatmasını ve daha sonra logger.LogMessage("poop", Logger.LogLevel.High, false); arayarak ve hiçbir şey gösteriyor ediyorum.

Teşekkür

+0

  • kullanım FileMode.APPEND) StreamWriter elden eamWriter açık. Verileri "Dispose" olarak adlandırıncaya kadar genellikle temizlenmez. – vesan

  • cevap

    2

    yazma ara belleğe ediliyor, her Günlüğü işlevi sonunda logFileStream.Flush(); arayarak deneyin.

    Dosya tanıtıcıları arasında açık tutulmamalıydınız, eğer siz olsaydım, her bir işlevde açıp kapatırdım. Eğer çok fazla kayıt yapıyorsanız, kendiniz belleğe alın ve belirli bir boyuta ulaştıktan sonra her şeyi dökün.

    +0

    Hafızada kendimi tamponlamak ne demek istiyorsun? Gibi belirli bir boyuta ulaşana kadar floş çağrı değil mi? Tamponun boyutunu nasıl kontrol edebilirim? – user3519261

    +0

    Bir seçenek daha sonra bir StreamWriter ile yazdığınız 'MemoryStream''e yazmaktır. 'Position' özelliği size şimdiye kadar ne kadar yazdığınızı söyleyecektir ve' GetBuffer() 'size bir dizi bayt verecektir. Alternatif olarak 'StringBuilder' kullanabilirsiniz, bu durumda' Length' size uzunluk verir ve ToString() size tek bir string verir. Şahsen çoğu durumda MemoryStream kullanıyorum. –

    1

    sizin örnek doğru sürümünün

    • kullanım autoflush akışı yazar = true her istekte açma/kapama akımı
    • Bu edilir - Doğru uygulanırsa, autoflush gereksizdir (floş yapılacaktır erdikten sonra günlükçü sınıfı `Str` FileStream` ve tutuyor
     
        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(); 
           } 
          } 
         } 
        }