2017-11-11 3 views
0

背景: 各行に対して指定された日のログファイルに保存されるコンソールアプリケーションで作業しています(例:2017年1月5日は01_05_2017_log_.txt)List.Add()は前の値を再追加します

各ログは想定どおりに追加されますが、私が理解できない問題は、ログ値を含むリストの以前の値をすべて追加している理由です。

したがって、CurrentLogs.Add("Some log here")が呼び出されているときは、Some log hereがCurrentLogsリストに追加されます。

もう一度呼び出しますが、今回は使用する文字列はanother log hereです。次のようにリスト内の項目は以下のとおりです。

  • ここ
  • ここ
  • いくつかのログいくつかのログ

そして、私が使用しようとするならば、これら3が再度追加され、ここで別のログ。もう一度メソッドを追加してください

私は見て、これを回避する方法は、ビン、Google、役に立たない。

// This is the List object I'm using. 
public class LoggerList<T> : List<T> 
{ 
    public event EventHandler OnAdd; 
    public new void Add(T item) 
    { 
     OnAdd?.Invoke(this, null); 
     base.Add(item); 
    } 
} 

は今ここにLogger.CurrentLogs.Add()はここROM

public class Logger 
{ 
    // Directory in which logs are stored 
    private static string _loggerPath = "Logs/"; 
    // Used to check if the Old Logs have already been added to the OldLogs Object 
    private static bool _alreadyPulled = false; 
    // Previously saved logs before the current use of the console app 
    private static readonly List<string> OldLogs = new List<string>(); 
    // Current logs to be added here 
    public static LoggerList<string> CurrentLogs = new LoggerList<string>(); 

    //EventHandler to Save Logs on add 
    public static void OnAdd(object sender, EventArgs e) 
    { 
     SaveLog(); 
    } 

    /// <summary> 
    /// Saves the logs 
    /// </summary> 
    public static void SaveLog() 
    { 
     if (!Directory.Exists(_loggerPath)) 
     { 
      Directory.CreateDirectory(_loggerPath); 
     } 

     string fileName = _loggerPath + DateTime.Now.ToString("MM_dd_yyyy") + "_log_.txt"; 
     // If the File Exists, contiue with loading 
     if (File.Exists(fileName)) 
     { 
      // If the OldLogs have not already been pulled, pull them 
      if (!_alreadyPulled) 
      { 
       var oldLogs = File.ReadAllLines(fileName).ToList(); 
       foreach (var i in oldLogs) 
       { 
        OldLogs.Add(i); 
       } 
       _alreadyPulled = true; // Let know that the OldLogs have already been pulled this instance 
      } 
      List<string> lines = OldLogs; 
      lines.AddRange(CurrentLogs); 
      File.Delete(fileName); 

      var sr = File.CreateText(fileName); 
      foreach (string x in lines) 
      { 
       sr.WriteLine(x); 
      } 
      sr.Flush(); 
      sr.Close(); 
     } 
     // Only go here if the file doesn't exist 
     else 
     { 
      var sr = File.CreateText(fileName); 
      foreach (string x in CurrentLogs) 
      { 
       sr.WriteLine(x); 
      } 
      sr.Flush(); 
      sr.Close(); 
     } 
    } 
} 

fが呼ばれLoggerクラスが、これはメッセンジャークラスが クラスプログラム { 静的な無効メインと呼ばれている場所としてこれを追加するProgram.cs(ありさ(string [] args) { Logger.CurrentLogs.OnAdd + = Logger.OnAdd; CommandManager.InitCommands(); CheckForEntrie s();

} 

    private static void CheckForEntries() 
    { 
     while (true) 
     { 
      Console.ForegroundColor = ConsoleColor.White; 
      var text = Console.ReadLine(); 
      try 
      { 
       if (!SendEntry(text)) 
       { 
        Console.WriteLine("Failed to send"); 
       } 
      } 
      catch (CommandNotFoundException ex) 
      { 
       Messenger.Send("Commmand does not exist (" + text.GetWords()[0] + ")"); 
      } 
     } 
    } 

    private static bool SendEntry(string text) 
    { 
     try 
     { 
      if (text.FirstCharacter() != "/") 
      { 
       return false; 
      } 
      else 
      { 
       string text2 = text.Substring(1); 
       string commandname = text2.GetWords()[0]; 
       foreach (Command c in CommandManager.RegisteredCommands) 
       { 
        if (c.Name.ToLower() == commandname.ToLower()) 
        { 
         c.Run(text2.Substring(commandname.Length)); 
         return true; 
        } 
        else 
        { 
         foreach (string alias in c.Aliases) 
         { 
          if (alias.ToLower() == commandname.ToLower()) 
          { 
           c.Run(text2.Substring(commandname.Length + 1)); 
           return true; 
          } 
         } 
        } 
       } 
       throw new CommandNotFoundException(); 
      } 
     } 
     catch (CommandNotFoundException ex) 
     { 
      throw ex; // Placed here so that the catch (Exception) does not go beyond 
     } 
     catch (Exception ex) 
     { 
      Console.WriteLine(ex); 
      return false; 
     } 
    } 


} 

そしてここMessenger.cs(.Add直接起こる場合)

// Color codes 
private static readonly string[] codes = 
    { 
     "0", "1", "2", "3", "4", "5", "6", "7", "8", "9", 
     "a", "b", "c", "d", "e", "f" 
    }; 

    private static string Format(string rawText) 
    { 
     return "&e" + TimeStamp() + " " + rawText; 
    } 

    public static string TimeStamp() 
    { 
     return "<" + DateTime.Now.ToString("MM/dd/yyyy hh:mm:ss") + ">"; 
    } 
    public static void Send(string textRaw) 
    { 
     Logger.CurrentLogs.Add(Format(textRaw).Substring(2)); 
     string text = Format(textRaw); 
     List<int> skipOver = new List<int>(); 
     for (int txt = 0; txt <= text.Length - 1; txt++) 
     { 
      char[] chars = text.ToCharArray(); 
      if (chars[txt].ToString() == "&") 
      { 
       List<string> hi = codes.ToList(); 
       if (hi.Contains(chars[txt + 1].ToString().ToLower())) 
       { 
        skipOver.Add(txt); 
        skipOver.Add(txt + 1); 
       } 
      } 
     } 

     for (int x = 0; x <= text.Length - 1; x++) 
     { 

      char[] chars = text.ToCharArray(); 
      if (chars[x] == "&".ToCharArray()[0]) continue; 
      if (x <= 1 || skipOver.Contains(x)) continue; 
      char behind2 = chars[x - 2]; 
      char behind1 = chars[x - 1]; 
      if (behind2.ToString() == "&") 
      { 
       bool isGoodCode = false; 
       foreach (string s in codes) 
       { 
        if (s.ToLower() == behind1.ToString().ToLower()) 
        { 
         isGoodCode = true; 
        } 
       } 

       if (isGoodCode) 
       { 
        skipOver.Add(x - 2); 
        skipOver.Add(x - 1); 
        if (x < text.Length - 1) 
        { 
         Color baseColor = ToColor(behind1.ToString()); 
         ConsoleColor cColor = ToConsoleColor(baseColor); 
         Console.ForegroundColor = cColor; 
         Console.Write(chars[x]); 
        } 
        else if (x == text.Length - 1) 
        { 
         Color baseColor = ToColor(behind1.ToString()); 
         ConsoleColor cColor = ToConsoleColor(baseColor); 
         Console.ForegroundColor = cColor; 
         Console.WriteLine(chars[x]); 
        } 
       } 
       else 
       { 
        if (x < text.Length - 1) 
        { 
         Console.Write(chars[x - 2]); 
         Console.Write(chars[x - 1]); 
         Console.Write(chars[x]); 
        } 
        else if (x == text.Length - 1) 
        { 
         Console.Write(chars[x - 2]); 
         Console.Write(chars[x - 1]); 
         Console.WriteLine(chars[x]); 
        } 
       } 
      } 
      else 
      { 
       if (x < text.Length - 1) 
       { 
        Console.Write(chars[x]); 
       } 
       else if (x == text.Length - 1) 
       { 
        Console.WriteLine(chars[x]); 
       } 
      } 
     } 
    } 
+0

?おそらく問題があるかもしれません... – casiosmu

+0

ちょうど2つのノート: 1.リストの内容をファイルに書き出した後に、現在のログをクリアしないでください。 2.使用が簡単ではないと思わないでください。 File.AppendAllLines(fileName、CurrentLogs); 現在の実装と同じように、既存のログファイルを読み書きするのではなく、 私はそれが多くのコードを惜しまないと信じています。少なくとも私は自分のプロジェクトで使っている簡単なロガーでやっていることです。 –

答えて

2
これらの行では

List<string> lines = OldLogs; 
lines.AddRange(CurrentLogs); 

"行" "OldLogs" と同じオブジェクトを指しています。したがって、同じリストにエントリを追加し続けます。

代わりにコピーしてみてください可能性があります。addが起こるん

var lines = new List<string>(OldLogs); 
+0

興味深いことに、それは働いた。 – apotter96

関連する問題