2011-01-19 6 views
6

У меня есть приложение, которое работает на автономном ПК в киоске (C#/WPF). Он выполняет некоторые типичные операции регистрации в текстовом файле. ПК имеет ограниченное количество дискового пространства для хранения этих журналов по мере их роста.Сохранение файлов журнала под определенным размером

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

Получение размера файла не представляет проблемы, но существуют ли какие-либо типичные методы манипуляции файлами, чтобы сохранить файл под определенным размером?

ответ

14

Один из способов обработки этого файла состоит в том, чтобы иметь два файла журнала, которые имеют половину максимального размера. Вы просто вращаетесь между ними, когда достигнете максимального размера каждого файла. Поворот в файл заставляет его перезаписывать новый файл.

рамки регистрации таких как log4net эта функциональность встроена.

4

Там нет простого способа лишить данные с начала файла. Таким образом, у вас есть несколько вариантов:

  1. Храните журнал в нескольких небольших файлах журнала и удалите самые старые «куски», если общий размер всех файлов журнала превышает ваш лимит. Это похоже на то, что вы хотите сделать, но на другом уровне
  2. Переименуйте файл журнала в «log.date» и запустите новый журнал. Аналогично (1), но не вариант, если у вас ограниченное дисковое пространство.
  3. Если у вас достаточно ОЗУ, а размер вашего журнала относительно невелик для размещения в памяти, вы можете сделать следующее: сопоставить весь файл в памяти с помощью файла с отображением памяти, а затем выполнить операцию перемещения, взяв данные с середины файл и переместить их в начало. Затем обрезайте файл. Это единственный способ легко удалить данные из начала файла журнала без создания его копии.
+0

Отличный обзор жизнеспособных вариантов. – cc0

0

я бы не использовать это для файла означает, что над сказать 1 МОм, и это не очень эффективно, но работает хорошо, если вам нужно решите проблему, когда вам нужен файл журнала, который вы не можете поддерживать удобно. Убедитесь, что файл журнала существует, прежде чем использовать его, хотя ... или вы можете добавить код для него, а также проверить, существует ли местонахождение и т. Д.

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

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

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