Обратный Streamreader

У меня есть приложение, что для меня определили задачу с чисткой после. Само приложение относительно просто - оно выполняет SQL-запрос, использует веб-сервис и извергает результаты к файлу журнала. Мое задание состоит в том, чтобы заархивировать файлы к нашему NAS после того, как приложение будет сделано с ними. Это блокирует файлы исключительно, пока это не сделано с ними так, это добавляет маленький бит сложности. Мне также не разрешают коснуться приложения, просто журналы. Так или иначе мое приложение довольно просто:

  1. Проверьте, может ли файл быть открыт (поймайте IOException), и отделите его как доступный в bool [], если никакое исключение не выдается.
  2. При прохождении через массива файлов, отмеченных верный, считайте каждую строку файла в StreamReader с помощью метода ReadLine. Поскольку приложение иногда икает и не заканчивается, я не могу просто использовать IOException, чтобы сказать, завершается ли файл - я должен на самом деле проанализировать текст.
  3. Если текст, указывающий на завершение, найден, архивируйте файл, загрузите заархивированный файл на NAS и удалите оригинал.

Мои работы кода, это является просто очень трудоемким (файлы журнала - каждый приблизительно 500 МБ). Мои мысли об улучшении включают запуск моего поиска от нижней части файла вместо от вершины, но StreamReader не поддерживает такой метод. Я не могу использовать метод ReadToEnd и затем инвертировать чтение, потому что это просто бросает из исключения памяти. Какие-либо мысли о пути я мог ускорить парсинг файла журнала?

5
задан monkeyninja 4 June 2010 в 17:19
поделиться

1 ответ

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

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

Поиск до конца -3 байта может быть выполнен с помощью кода, подобного следующему

// Seek -3 bytes starting from the end of the file
fileStream.Seek(-3, SeekOrigin.End);
6
ответ дан 14 December 2019 в 13:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: