![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Доступ к открытому собой файлу
kami © (2008-12-23 20:58:00)Знаю, вопрос изъезжен, но понять, в чем дело - не могу.
Имеется одна программа, которая пишет лог в файл (запись производится из разных потоков, но все разграничено критическими секциями).
LogFile:=TFileStream.Create(ChangeFileExt(ParamStr(0), '.log'), fmOpenReadWrite or fmShareDenyNone); // наследник от TFileStream.
Модуль той же программы, который ничего не знает о логе, пытается прочитать данные из этого файла.
FS := TFileStream.Create(ChangeFileExt(ParamStr(0), '.log'), fmOpenRead or fmShareDenyNone);
И считываются данные, актуальные на момент предыдущего запуска программы, то есть лог за "текущую сессию" сидит только в памяти.
Как быть? Ведь всякие Notepad-ы считывают все данные без проблем ...
Riply (2008-12-24 19:05:00) [1]> [12] kami © (24.12.08 18:43)
> Попробую рассказать подробнее:
> запущена программа, открыт файл лога ([0]), в него постоянно что-то пишется с указанием времени записи.
> В определенный момент нужно получить записанные данные.
> Открываем файл повторно (в той же программе, но другой unit).
> И в этом unit-е "не видны" последние записанные данные. Освобождаем файл.
> Открываем файл лога notepad-ом - видим весь лог, вплоть до той секунды, когда файл лога стал открыт notepad-ом.
Попробуй сначала прочитать notepad-ом, а потом открыть в программе. Что выдет ?
clickmaker (2008-12-24 18:49:00) [2]> Да, файл лога открыт постоянно, но прочитать пытается та
> же программа
я бы в этом случае не стал лишний раз открывать файл из другого юнита. Можно же в классе лога завести событие, которое будет возникать при записи. А соседний юнит подписать на это событие. Так будут точно свежие данные
kami (2008-12-24 18:43:00) [3]> [10] Медвежонок Пятачок © (24.12.08 14:11)
> Ну про то что в нотепаде все шоколадно это ты сказал а не
> я.
Я сказал только то, что в notepad видны все данные, включая те, которые были записаны в файл во время текущего запуска программы. В отличие от самой программы, в которой видны данные до текущего запуска, а вот последние, и самые актуальные - нет.
> само по себе это автоматом не приведет к обновлению окна
> вьюера
а мне это и не надо. Нужно, чтобы по запросу программа получала данные "на текущий момент", а не за прошлые запуски. Вот этого и не получается.
Попробую рассказать подробнее:
запущена программа, открыт файл лога ([0]), в него постоянно что-то пишется с указанием времени записи. В определенный момент нужно получить записанные данные. Открываем файл повторно (в той же программе, но другой unit). И в этом unit-е "не видны" последние записанные данные. Освобождаем файл.
Открываем файл лога notepad-ом - видим весь лог, вплоть до той секунды, когда файл лога стал открыт notepad-ом.
> [11] Anatoly Podgoretsky © (24.12.08 15:00)
> есть программа, которая иногда сбрасывает данные в файл
> без закрытия и другая программа, которая пытается прочитать
> еще не зафиксированые записи
Не совсем так.
Да, файл лога открыт постоянно, но прочитать пытается та же программа (тот же экземпляр программы, тот же процесс...), правда в другом unit-e.
Anatoly Podgoretsky (2008-12-24 15:00:00) [4]> kami (24.12.2008 12:51:08) [8]
Если я правильно тебя понимаю, то есть программа, которая иногда сбрасывает данные в файл без закрытия и другая программа, которая пытается прочитать еще не зафиксированые записи.
Медвежонок Пятачок (2008-12-24 14:11:00) [5]Всякие нотепады за этим не следят, это не является их задачей
Ну про то что в нотепаде все шоколадно это ты сказал а не я.
А даже если пишущий процесс будет сбрасывать буферы и даже закрывать файл, то само по себе это автоматом не приведет к обновлению окна вьюера.
Сергей М. (2008-12-24 12:56:00) [6]
> периодический сброс буфера должен делать модуль, ведущий
> лог-файл
Конечно.
kami (2008-12-24 12:51:00) [7][1] Поросенок Винни-Пух © (23.12.08 23:15)
> всякие нотепады, открыв файл, следят за событиями нотификации,
> а не полагаются на дядю
Всякие нотепады за этим не следят, это не является их задачей, исключение составляет вроде Notepad++, который при изменении файла выдает запрос на считывание его заново. Простой notepad, включенный в состав Win, этим не занимается, однако читает данные вплоть до последнего записанного байта.
> [2] DVM © (23.12.08 23:22)
> это в какой момент происходит?
В принципе, в любой. Но - однозначно после того, как файл лога уже открыт и в него что-то записалось.
> [3] Anatoly Podgoretsky © (24.12.08 00:01)
> Всякие Notepad открывают файл на чтение и считывают его
> в буфер, потом закрывают до возможного сохранения.
То же самое делаю и я:
Пришла команда на чтение файла, открыт файл, считана информация в буфер, закрыт файл.
P.S. Подчеркну - закрыт не лог, а файл в модуле той же программы, который ничего не знает о логе
> [5] Сергей М. © (24.12.08 09:08)
> The FlushFileBuffers function
The file handle must have the GENERIC_WRITE access right
То есть, периодический сброс буфера должен делать модуль, ведущий лог-файл. Или открывать файл во втором модуле с правами на запись и чтение? Первый вариант не очень удобный - нужно либо сбрасывать буфер по таймеру, либо после каждой записи в лог (вообще нереально).
На той же странице (в MSDN) нашел флаг FILE_FLAG_NO_BUFFERING, о наличии которого успел благополучно забыть. Если ничего не поможет, буду использовать его.
Спасибо.
Медвежонок Пятачок (2008-12-24 09:26:00) [8]хотя может быть байты, записанные в лог после открытия вьюера сами "запрыгивают" с диска в память вьюера.
если и фар не следит.
Медвежонок Пятачок (2008-12-24 09:22:00) [9]Неужели?
Т.е. неужели следят? И неужели что-то знают о каком-то там "дяде"?
Насчет нотепада не уверен, но вьюер фара например следит.
я так собственные логи читаю прямо по ходу их формирования.
он еще и скроллит их сам по мере дописывания строк в лог.
Сергей М. (2008-12-24 09:08:00) [10]
> kami
The FlushFileBuffersfunction clears the buffers for the specified file and causes all buffered data to be written to the file
Германн (2008-12-24 01:12:00) [11]
> Поросенок Винни-Пух © (23.12.08 23:15) [1]
>
> Как быть? Ведь всякие Notepad-ы считывают все данные без
> проблем ...
>
> всякие нотепады, открыв файл, следят за событиями нотификации,
> а не полагаются на дядю
>
Неужели?
Т.е. неужели следят? И неужели что-то знают о каком-то там "дяде"?
Anatoly Podgoretsky (2008-12-24 00:01:00) [12]Всякие Notepad открывают файл на чтение и считывают его в буфер, потом закрывают до возможного сохранения.
DVM (2008-12-23 23:22:00) [13]
> Модуль той же программы, который ничего не знает о логе,
> пытается прочитать данные из этого файла.
> FS := TFileStream.Create(ChangeFileExt(ParamStr(0), '.log'),
> fmOpenRead or fmShareDenyNone);
это в какой момент происходит?
Поросенок Винни-Пух (2008-12-23 23:15:00) [14]Как быть? Ведь всякие Notepad-ы считывают все данные без проблем ...
всякие нотепады, открыв файл, следят за событиями нотификации, а не полагаются на дядю