Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.02.08;
Скачать: CL | DM;

Вниз

Доступ к открытому собой файлу   Найти похожие ветки 

 
kami ©   (2008-12-23 20:58) [0]

Знаю, вопрос изъезжен, но понять, в чем дело - не могу.

Имеется одна программа, которая пишет лог в файл (запись производится из разных потоков, но все разграничено критическими секциями).
LogFile:=TFileStream.Create(ChangeFileExt(ParamStr(0), ".log"), fmOpenReadWrite or fmShareDenyNone); // наследник от TFileStream.
Модуль той же программы, который ничего не знает о логе, пытается прочитать данные из этого файла.
FS := TFileStream.Create(ChangeFileExt(ParamStr(0), ".log"), fmOpenRead or fmShareDenyNone);
И считываются данные, актуальные на момент предыдущего запуска программы, то есть лог за "текущую сессию" сидит только в памяти.
Как быть? Ведь всякие Notepad-ы считывают все данные без проблем ...


 
Поросенок Винни-Пух ©   (2008-12-23 23:15) [1]

Как быть? Ведь всякие Notepad-ы считывают все данные без проблем ...

всякие нотепады, открыв файл, следят за событиями нотификации, а не полагаются на дядю


 
DVM ©   (2008-12-23 23:22) [2]


> Модуль той же программы, который ничего не знает о логе,
>  пытается прочитать данные из этого файла.
> FS := TFileStream.Create(ChangeFileExt(ParamStr(0), ".log"),
>  fmOpenRead or fmShareDenyNone);

это в какой момент происходит?


 
Anatoly Podgoretsky ©   (2008-12-24 00:01) [3]

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


 
Германн ©   (2008-12-24 01:12) [4]


> Поросенок Винни-Пух ©   (23.12.08 23:15) [1]
>
> Как быть? Ведь всякие Notepad-ы считывают все данные без
> проблем ...
>
> всякие нотепады, открыв файл, следят за событиями нотификации,
>  а не полагаются на дядю
>

Неужели?
Т.е. неужели следят? И неужели что-то знают о каком-то там "дяде"?


 
Сергей М. ©   (2008-12-24 09:08) [5]


> kami


The FlushFileBuffers function clears the buffers for the specified file and causes all buffered data to be written to the file


 
Медвежонок Пятачок ©   (2008-12-24 09:22) [6]

Неужели?
Т.е. неужели следят? И неужели что-то знают о каком-то там "дяде"?


Насчет нотепада не уверен, но вьюер фара например следит.
я так собственные логи читаю прямо по ходу их формирования.
он еще и скроллит их сам по мере дописывания строк в лог.


 
Медвежонок Пятачок ©   (2008-12-24 09:26) [7]

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

если и фар не следит.


 
kami ©   (2008-12-24 12:51) [8]

[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 12:56) [9]


> периодический сброс буфера должен делать модуль, ведущий
> лог-файл


Конечно.


 
Медвежонок Пятачок ©   (2008-12-24 14:11) [10]

Всякие нотепады за этим не следят, это не является их задачей

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


 
Anatoly Podgoretsky ©   (2008-12-24 15:00) [11]

> kami  (24.12.2008 12:51:08)  [8]

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


 
kami ©   (2008-12-24 18:43) [12]

> [10] Медвежонок Пятачок ©   (24.12.08 14:11)
> Ну про то что в нотепаде все шоколадно это ты сказал а не
> я.

Я сказал только то, что в notepad видны все данные, включая те, которые были записаны в файл во время текущего запуска программы. В отличие от самой программы, в которой видны данные до текущего запуска, а вот последние, и самые актуальные - нет.
> само по себе это автоматом не приведет к обновлению окна
> вьюера

а мне это и не надо. Нужно, чтобы по запросу программа получала данные "на текущий момент", а не за прошлые запуски. Вот этого и не получается.

Попробую рассказать подробнее:
запущена программа, открыт файл лога ([0]), в него постоянно что-то пишется с указанием времени записи. В определенный момент нужно получить записанные данные. Открываем файл повторно (в той же программе, но другой unit). И в этом unit-е "не видны" последние записанные данные. Освобождаем файл.
Открываем файл лога notepad-ом - видим весь лог, вплоть до той секунды, когда файл лога стал открыт notepad-ом.


> [11] Anatoly Podgoretsky ©   (24.12.08 15:00)
> есть программа, которая иногда сбрасывает данные в файл
> без закрытия и другая программа, которая пытается прочитать
> еще не зафиксированые записи

Не совсем так.
Да, файл лога открыт постоянно, но прочитать пытается та же программа (тот же экземпляр программы, тот же процесс...), правда в другом unit-e.


 
clickmaker ©   (2008-12-24 18:49) [13]

> Да, файл лога открыт постоянно, но прочитать пытается та
> же программа

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


 
Riply ©   (2008-12-24 19:05) [14]

> [12] kami ©   (24.12.08 18:43)
> Попробую рассказать подробнее:
> запущена программа, открыт файл лога ([0]), в него постоянно что-то пишется с указанием времени записи.
> В определенный момент нужно получить записанные данные.
> Открываем файл повторно (в той же программе, но другой unit).
> И в этом unit-е "не видны" последние записанные данные. Освобождаем файл.
> Открываем файл лога notepad-ом - видим весь лог, вплоть до той секунды, когда файл лога стал открыт notepad-ом.

Попробуй сначала прочитать notepad-ом, а потом открыть в программе. Что выдет ?



Страницы: 1 вся ветка

Текущий архив: 2009.02.08;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.009 c
15-1229321086
Slider007
2008-12-15 09:04
2009.02.08
С днем рождения ! 15 декабря 2008 понедельник


2-1229692515
kyn66
2008-12-19 16:15
2009.02.08
Доступ к БД Interbase


2-1230383918
Te
2008-12-27 16:18
2009.02.08
SQL в delphi


15-1229096167
NailMan
2008-12-12 18:36
2009.02.08
Как упростить Start/Stop сервисов в Win?


2-1229689535
kyn66
2008-12-19 15:25
2009.02.08
Неправильно-полосатый Grid