Монитор файлов журнала - PullRequest
4 голосов
/ 10 апреля 2009

Можно ли открыть текстовый файл и прочитать содержимое, пока другое приложение обновляет файл, таким образом, чтобы это не вызывало конфликт блокировки?

Мне нужно отслеживать файл журнала из одного приложения, которое обновляется другим приложением каждый раз, когда происходит событие.

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

Спасибо, Питер

Ответы [ 8 ]

10 голосов
/ 10 апреля 2009

зависит от того, как первое приложение откроет этот файл.

Т.е. при вызове API CreateFile для открытия файла существует параметр dwShareMode, который сообщает API, как его открыть (если ему было дано 0, к нему нельзя получить доступ из других приложений IIRC). в противном случае не должно быть проблем с чтением из этого файла. если я не ошибаюсь, чтобы проверить, что этот файл открывается только для чтения, вы можете позвонить что-то вроде

CreateFile(pchar(fName), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0) ;
1 голос
/ 11 апреля 2009
  1. Загрузка Process Monitor от Sysinternals.
  2. Откройте диалоговое окно фильтра и добавьте фильтр «путь» для вашего файла журнала.
  3. Запустите приложение для записи журнала (я назову это «logwriter»).
  4. Найдите и щелкните событие, когда logwriter создает CreateFile.
  5. В разделе «Сведения» должно быть указано «Требуемый доступ: общая запись». И он должен иметь «ShareMode: Read», что соответствует FILE_SHARE_READ при вызове CreateFile. Это означает: «Я, создатель журнала, разрешаю другим читать мой файл».
  6. Теперь запустите приложение для чтения журналов («logreader») и выполните то же упражнение.
  7. Деталь должна иметь «Требуемый доступ: общее чтение». И он должен иметь «ShareMode: Read, Write», что означает: «Я, logreader, разрешаю другим, включая logwriter, читать и писать в файл журнала».

Это самые разумные значения, я думаю, и они будут препятствовать блокировке. Другие комбинации могут быть допустимы. Там здесь таблица .

Так вот, вы еще не сказали, что происходит, когда "кажется, не работает во всех случаях". Что делать дальше будет действительно зависеть от деталей. Надеемся, что вышеизложенное даст вам достаточно информации, чтобы понять, что происходит.

0 голосов
/ 03 декабря 2009

используем "Tail for win32",

Я знаю, что это не Delphi, но это может быть полезно

http://tailforwin32.sourceforge.net/

0 голосов
/ 02 декабря 2009

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

1 - проверка на изменение «даты последнего изменения» времени - если это изменится, то вы знаете, что-то произошло.

2 - Если мод datetime изменился, то (в зависимости от размера файла) может быть достаточно создать копию файла и проверить , что .

0 голосов
/ 02 декабря 2009

XpoLog добьется цели без изменения вашей среды или кода, монитор журнала XpoLog

0 голосов
/ 11 апреля 2009

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

В прошлом у меня был успех: моя программа ожидала, когда файл станет доступным, затем быстро открывала его, собирала необходимые данные и закрывала его. По крайней мере, в DOS попытка получить доступ к заблокированному файлу вызвала несколько попыток, и я увеличил этот параметр, чтобы, если другая программа попыталась найти файл, пока он у меня был, они просто задержались и никогда не увидели ошибку. *

Мне даже удалось обновить файл (я убедился, что НЕ , чтобы закрыть его между ними!), Но другая программа ничего не знала.

Ужасно как грех, но мы не могли изменить другую программу, так что это был единственный способ выполнить работу. Он был развернут в течение многих лет, и я никогда не слышал писк от пользователей этой системы. Наконец, он ушел, когда машина, которой управляла другая программа, была удалена.

0 голосов
/ 10 апреля 2009

Попробуйте использовать FileSystemWatcher , чтобы получить события при обновлении файла.

Более дружелюбный к Delphi ссылка

0 голосов
/ 10 апреля 2009

Вы не получите конфликт блокировки, потому что приложение для записи вряд ли заблокировало файл. Выполнение того, что вы предлагаете, обычно работает без проблем (это то, что делает команда UNIX tail -f ), и те незначительные сбои, которые возникают, можно игнорировать. В прошлом я написал несколько приложений для мониторинга журналов, которые работали так, без проблем.

...