Форум: "Начинающим";
Текущий архив: 2009.02.08;
Скачать: [xml.tar.bz2];
ВнизДоступ к открытому собой файлу Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.49 MB
Время: 0.006 c