2011-01-19 14 views
6

Possiedo un'applicazione in esecuzione su un PC panel autonomo in un chiosco (C#/WPF). Esegue alcune tipiche operazioni di registrazione in un file di testo. Il PC ha una quantità limitata di spazio su disco per archiviare questi registri man mano che crescono.Mantenere i file di registro con una determinata dimensione

Quello che devo fare è essere in grado di specificare la dimensione massima consentita da un file di registro. Se, quando si tenta di scrivere sul log, viene superata la dimensione massima, i nuovi dati verranno scritti alla fine del log e i dati più vecchi verranno eliminati dall'inizio.

Ottenere le dimensioni del file non è un problema, ma esistono tecniche tipiche di manipolazione dei file per mantenere un file di una certa dimensione?

risposta

14

Una tecnica per gestire questo è di avere due file di registro che sono la metà della dimensione massima ciascuno. Ruotate semplicemente tra i due mentre raggiungete la dimensione massima di ogni file. La rotazione su un file fa sì che venga sovrascritta con un nuovo file.

Un quadro di registrazione come log4net ha questa funzionalità incorporata.

4

Non c'è un modo facile mettere a nudo i dati dall'inizio del file. Quindi hai diverse opzioni:

  1. Tenere il registro in diversi file di registro più piccoli ed eliminare i "blocchi" più vecchi se la dimensione totale di tutti i file di registro supera il limite. È simile a ciò che si desidera fare, ma a livello diverso
  2. Rinominare il file di registro in "log.date" e avviare un nuovo registro. Simile a (1) ma non un'opzione se si dispone di spazio su disco limitato.
  3. Se la RAM è sufficiente e le dimensioni del registro sono relativamente piccole per adattarsi alla memoria, è possibile effettuare le seguenti operazioni: mappare l'intero file in memoria utilizzando il file mappato in memoria, quindi eseguire l'operazione di spostamento prendendo i dati dal centro di il file e spostandoli all'inizio. Quindi troncare il file. Questo è l'unico modo per rimuovere facilmente i dati dall'inizio del file di registro senza crearne una copia.
+0

Grande riepilogo delle opzioni valide. – cc0

0

Non vorrei usare questo per un file vuole essere più di dire che 1 Meg e non è terribilmente efficace, ma funziona bene se è necessario risolvere un problema fastidioso di quando hai bisogno di un file di registro che non puoi mantenere comodamente. Assicurati che il file di registro esista prima di usare questo però ... oppure potresti aggiungere codice per controllare la posizione, ecc.

// 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); 
     } 
    } 
} 
Problemi correlati