Лучший способ для чтения в файле журнала прокатки в .NET? - PullRequest
3 голосов
/ 13 января 2009

Мне нужно прочитать в файле журнала прокатки в .NET 3.5sp1. Мне интересно, как лучше это сделать? Файл может стать действительно большим. У меня была идея:

  • Открыть файл
  • Считать файл до последней прочитанной строки (в первом случае это было 0)
  • Читать все оставшиеся строки
  • Закрыть поток и запомнить последний прочитанный номер строки.
  • Подождите немного.
  • Полоскание / повтор.

Я не уверен, что это лучший и эффективный способ для памяти, учитывая, что файл может быть довольно большим. И я не могу заблокировать файл журнала: (

Мысли

Ответы [ 3 ]

1 голос
/ 13 января 2009

Вот пример использования FileSystem Watcher для открытия файла и считывания новых данных в том виде, как они написаны:

http://www.codeproject.com/KB/cs/wintail.aspx

Пример выглядит неплохо, но не из-за любви к Питу и всем нечетким вещам пользуюсь замком (это). Это плохо. Вместо этого используйте новый объект, которым вы можете поделиться со всеми объектами в классе.

Если вы откроете файл ReadOnly, у вас не должно быть нарушения общего доступа в зависимости от того, как ваш файл был открыт программой, добавляющей файл журнала.

0 голосов
/ 13 января 2009

Можете ли вы просто добавить файл, а не отслеживать, где вы находитесь?

    Object mLogLock = new Object(); //to make logging thread safe
    string mLogFile = ""; //set your log location
    string mLogDirectory = "";
    public void HandleMessage(string inMessage)
    {

        lock (mLogLock)
        {
            if (!System.IO.Directory.Exists(mLogDirectory ))
            {
                System.IO.Directory.CreateDirectory(mLogDirectory );
            }

            String theMessage = DateTime.Now.ToString("s");
            if (inMessage != null)
                theMessage += " : " + inMessage;

            StreamWriter sw = new StreamWriter(mLogFile, true);

            sw.WriteLine(theMessage );

            sw.Dispose();
            sw.Close();
        }
    }

В противном случае, если ваш писатель пишет в одной точке и что-то еще потребляет, и у вас нет блокировки, тогда ваша программа будет повреждать ваши журналы. Это даже не вопрос. Вы можете попытаться заблокировать ваш файл, открыв файл для монопольного чтения / записи любым пользователем, который хочет прочитать или записать его, но тогда другой код вызовет исключения, когда он не сможет его прочитать.

Если файл журнала находится в той же программе, вы можете просто хранить всю информацию в одном большом потоке, таком как MemoryStream, и использовать StreamWriter, как указано выше (или вместе с ним) для MemoryStream. Затем ваши читатели и писатели могут заблокировать MemoryStream, а не сам файл. Это поможет?

0 голосов
/ 13 января 2009

Получить длину файла и прочитать последний фрагмент файла. Нетрудно найти первый разрыв строки и показать все оттуда. FileStream имеет свойство Length, а метод read позволяет читать из одного места в другое.

Стивен прав. Если другая программа не требует эксклюзивного доступа, вы можете открыть только для чтения и все будет в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...