2011-01-19 13 views
6

Mam aplikację działającą na samodzielnym komputerze panelowym w kiosku (C#/WPF). Wykonuje typowe operacje logowania do pliku tekstowego. Komputer ma ograniczoną ilość miejsca na dysku do przechowywania tych dzienników w miarę ich wzrostu.Przechowywanie plików dziennika pod określonym rozmiarem

Co należy zrobić, to określić maksymalny rozmiar pliku dziennika, który może być. Jeśli przy próbie zapisu do dziennika przekroczony zostanie maksymalny rozmiar, nowe dane zostaną zapisane na końcu dziennika, a najstarsze dane zostaną usunięte od początku.

Uzyskanie rozmiaru pliku nie stanowi problemu, ale czy istnieją typowe techniki manipulowania plikami, aby zachować plik pod określonym rozmiarem?

Odpowiedz

14

Jedną z technik radzenia sobie z tym problemem jest posiadanie dwóch plików dziennika o połowej maksymalnej wielkości. Po prostu obracasz się między nimi, gdy osiągasz maksymalny rozmiar każdego pliku. Obracanie do pliku powoduje, że jest on zastępowany nowym plikiem.

ramy rejestrowanie takich jak log4net ma tę funkcjonalność wbudowaną.

4

Nie ma łatwy sposób rozebrać dane od początku pliku. Masz więc kilka opcji:

  1. Przechowuj dziennik w kilku mniejszych plikach dziennika i usuwaj najstarsze "porcje", jeśli łączny rozmiar wszystkich plików dziennika przekracza Twój limit. Jest to podobne do tego, co chcesz zrobić, ale na innym poziomie:
  2. Zmień nazwę pliku dziennika na "log.date" i uruchom nowy dziennik. Podobny do (1), ale nie jest opcją, jeśli masz ograniczone miejsce na dysku.
  3. JEŚLI masz wystarczającą ilość pamięci RAM, a rozmiar twojego dziennika jest stosunkowo mały, aby zmieścił się w pamięci, możesz wykonać następujące czynności: zmapuj cały plik do pamięci przy użyciu pliku odwzorowanego w pamięci, a następnie wykonaj operację przenoszenia, pobierając dane ze środka plik i przeniesienie go na początek. Następnie skróć plik. Jest to jedyny sposób na łatwe usunięcie danych z początku pliku dziennika bez tworzenia jego kopii.
+0

Wielkie podsumowanie stałym fragmencie. – cc0

0

Nie chciałbym użyć tego do pliku znaczy być na przykład 1 Meg i to nie jest strasznie wydajny, ale działa dobrze, jeśli trzeba rozwiązać brzydki problem, gdy potrzebujesz pliku dziennika, którego nie możesz wygodnie utrzymywać. Upewnij się, że plik dziennika istnieje przed użyciem tego chociaż ... czy można dodać kod do niej, jak również sprawdzenie lokalizacji istnieje, itp

// This is how to call it 
private void buttonLog_Click(object sender, EventArgs e) 
{ 
    c_Log.writeToFile(textBoxMessages.Text, "../../log.log", 1); 
} 


public static class c_Log 
{ 
    static int iMaxLogLength = 15000; // Probably should be bigger, say 200,000 
    static int iTrimmedLogLength = -1000; // minimum of how much of the old log to leave 

    static public void writeToFile(string strNewLogMessage, string strFile, int iLogLevel) 
    { 
     try 
     { 
      FileInfo fi = new FileInfo(strFile); 

      Byte[] bytesSavedFromEndOfOldLog = null; 

      if (fi.Length > iMaxLogLength) // if the log file length is already too long 
      { 
       using (BinaryReader br = new BinaryReader(File.Open(strFile, FileMode.Open))) 
       { 
        // Seek to our required position of what you want saved. 
        br.BaseStream.Seek(iTrimmedLogLength, SeekOrigin.End); 

        // Read what you want to save and hang onto it. 
        bytesSavedFromEndOfOldLog = br.ReadBytes((-1 * iTrimmedLogLength)); 
       } 
      } 

      byte[] newLine = System.Text.ASCIIEncoding.ASCII.GetBytes(Environment.NewLine); 

      FileStream fs = null; 
      // If the log file is less than the max length, just open it at the end to write there 
      if (fi.Length < iMaxLogLength) 
       fs = new FileStream(strFile, FileMode.Append, FileAccess.Write, FileShare.Read); 
      else // If the log file is more than the max length, just open it empty 
       fs = new FileStream(strFile, FileMode.Create, FileAccess.Write, FileShare.Read); 

      using (fs) 
      { 
       // If you are trimming the file length, write what you saved. 
       if (bytesSavedFromEndOfOldLog != null) 
       { 
        Byte[] lineBreak = Encoding.ASCII.GetBytes("### " + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") + " *** *** *** Old Log Start Position *** *** *** *** ###"); 
        fs.Write(newLine, 0, newLine.Length); 
        fs.Write(newLine, 0, newLine.Length); 
        fs.Write(lineBreak, 0, lineBreak.Length); 
        fs.Write(newLine, 0, newLine.Length); 
        fs.Write(bytesSavedFromEndOfOldLog, 0, bytesSavedFromEndOfOldLog.Length); 
        fs.Write(newLine, 0, newLine.Length); 
       } 
       Byte[] sendBytes = Encoding.ASCII.GetBytes(strNewLogMessage); 
       // Append your last log message. 
       fs.Write(sendBytes, 0, sendBytes.Length); 
       fs.Write(newLine, 0, newLine.Length); 
      } 
     } 
     catch (Exception ex) 
     { 
      ; // Nothing to do... 
       //writeEvent("writeToFile() Failed to write to logfile : " + ex.Message + "...", 5); 
     } 
    } 
} 
Powiązane problemy