Вопрос

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

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

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

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

Это было полезно?

Решение

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

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

CreateFile(pchar(fName), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0) ;

Другие советы

  1. Загрузите Process Monitor из Sysinternals.
  2. Откройте диалоговое окно фильтра и добавьте фильтр "путь" для вашего файла журнала.
  3. Запустите приложение для записи журнала (я буду называть это "logwriter").
  4. Найдите и щелкните по событию, в котором logwriter создает CreateFile.
  5. В разделе "Подробности" он должен иметь "Желаемый доступ:Общая запись".И у него должен быть "ShareMode:Читать", что соответствует FILE_SHARE_READ в вызове CreateFile.Это означает следующее: "Я, автор журнала, разрешаю другим Читать мое досье".
  6. Теперь запустите приложение для чтения журналов ("logreader") и выполните то же упражнение.
  7. Деталь должна иметь "Желаемый доступ:Общее чтение".И у него должен быть "ShareMode:Читать, записывать", что означает: "Я, logreader, разрешаю другим, включая logwriter, читать и записывать в файл журнала".

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

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

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

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

Более дружественный к delphi Ссылка

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

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

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

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

XpoLog сделает это без изменения вашего env или кода, XpoLog log monitor

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

1 - Проверьте наличие изменение даты и времени "последнего изменения" - если это изменится, тогда ты знаешь что - то случилось.

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

мы используем "Tail для win32",

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

http://tailforwin32.sourceforge.net/

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top