Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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.5 MB
Время: 0.006 c
2-1229692515
kyn66
2008-12-19 16:15
2009.02.08
Доступ к БД Interbase


3-1214555128
ruslan-id
2008-06-27 12:25
2009.02.08
Импорт уникальных записей из двух связанных таблиц


11-1197265467
MTsv DN
2007-12-10 08:44
2009.02.08
ComboBox в MainMenu?..


2-1229928616
Quart
2008-12-22 09:50
2009.02.08
Траблы с Таблой


2-1230027493
Slav
2008-12-23 13:18
2009.02.08
Добавить текст на изображение JPEG





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский