Форум » GUI » Как отловить событие правки файла ? » Ответить

Как отловить событие правки файла ?

Andrey: Допустим есть таблица со списками файлов (имя, дата, время). Тыкаем на файл и запускаю Notepad с этим файлом. После правки файла - как определить что Notepad закрылся и нужно изменить данные по файлу (дата, время) ? Можно событие какое то использовать ? Или можно только по таймеру это делать ?

Ответов - 13

Haz: Andrey пишет: После правки файла - как определить что Notepad закрылся и нужно изменить данные по файлу 1. По таймеру или в потоке крутить, пытаясь открыть файл в эксклюзиве. Если удалось, нотепад закрылся. 2 есть событие, обслуживающее изменение в каталоге. На форуме давно есть код. автор Петр . Пробовал, работает. Но в потоке проще решить

Andrey: Haz пишет: Но в потоке проще решить Не понял, что делать в потоке ? Notepad, да и другие проги чаще всего открывают не в экслюзиве. Мне вообще то Winmerge нужен, но пока делаю тест на Notepad. Haz пишет: На форуме давно есть код. А ссылку можешь дать ? Замучаешься искать без ключевого кода.

Haz: Andrey пишет: Notepad, да и другие проги чаще всего открывают не в экслюзиве. Тогда тебе мало что поможет . Если файл открывается не в эксклюзиве , то программа его просто считала в буфер и работает с этим буфером. В этом случае ловить по блокировке файла бесполезно. Ключевое слово для поиска wapi_FindFirstChangeNotification, но событие не гарантирует , что NotePad закрылся, событие отловит изменение в определенном каталоге, а это может быть простое сохранение файла из этого каталога, возможно другого файла и при этом NotePad все еще в работе. Если ты запускаешь NotePad из своей программы , то еще есть шанс как то контролировать этот процесс ( или запуская процесс напрямую или делая снимок процессов до и после запуска , а потом мониторишь процесс в памяти), если тыкаешь в файл в эксплорере и что то отрывается, то почти без вариантов. Даже событие FindFirstChangeNotification не отследит открытие. Ну и последнее с чем можно поиграть - это имя твоего файла в титле открытых окон.


SergKis: Andrey пишет После правки файла - как определить что Notepad закрылся и нужно изменить данные по файлу (дата, время) ? По таймеру проверка[pre2] Local tDtm1, tDtm2 // tTimeStamp ... hb_FGetDateTime( cFile1, @tDtm1 ) hb_FGetDateTime( cFile2, @tDtm2 ) IF tDtm1 != tDtm2 ... ENDIF ...[/pre2] работает, если было сохранение файла в редакторах и закрытие Notepad не обязательно PS Для Notepad не проверял, но с др. редакторами работает (похожую штуку использую)

Andrey: Haz пишет: Ключевое слово для поиска wapi_FindFirstChangeNotification, но событие не гарантирует , что NotePad закрылся, событие отловит изменение в определенном каталоге, а это может быть простое сохранение файла из этого каталога, возможно другого файла и при этом NotePad все еще в работе. Программа классная ! В моём случае даже не знаю как и делать. У меня 12 или чуть больше каталогов придётся мониторить. Буду думать... Спасибо БОЛЬШОЕ за подсказки !

Andrey: Сделал небольшой пример - опрос по таймеру, запуск WinMerge. После закрытия WinMerge - идёт проверка на изменение файлов. Работает вроде отлично. Кому интересно, смотрите - https://cloud.mail.ru/public/q7VT/5pwT29H3S

Andrey: Нашел в инете - https://stackoverflow.com/questions/17638674/how-to-wait-for-shellexecute-to-run Можно для ShellExecuteEx() отслеживать завершение его и сделать "сторожа" для запускаемых внешних программ. Т.е. тогда не нужен таймер для проверки есть ли такой хендл окна ShellExecuteEx(), при завершении этого окна получаем событие завершение этого окна, что очень удобно.

Andrey: Сделал сторожа запущенной программы (отдельного потока). Теперь можно обходиться без таймера. Исходники выслал Григорию.

Andrey: Сторож запущенной программы (отдельного потока) в Harbour MiniGUI Extended Edition 23.04 (Update 2) \MiniGUI\SAMPLES\Advanced\ShellExec

Andrey: Сделал с Сергеем два примера сторожа за списком файлов с ТСБ. Два варианта: с таймером и по событию. Исходники отправил Григорию.

Andrey: Примеры - сторож за списком файлов с ТСБ (таймером и по событию) уже в новой версии библиотеки МиниГуи. Спасибо Григорий ! P.S. Без Сергея эти примеры не получились бы ! СПАСИБО !

Andrey: Вопрос по новым примерам - MiniGUI\SAMPLES\Advanced\ShellExec Как заблокировать форму после нажатия кнопки - 'hb_ProcessOpen()' ? Чтобы вся форма заблокировалась. Есть такое в МиниГуи ? Я знаю что можно получить список всех объектов на форме и заблокировать их, но это долгое решение. И на форме всё скачет/бликует при прорисовке объектов.

SergKis: Andrey пишет Чтобы вся форма заблокировалась. Попробуй для объекта окна ThisWindow.Object:Enabled := .F. // .T. - вкл. назад This.Object:Enabled := .F. // .T. :Event(..., {|ow| ow:Enabled := .F., ... } или ф-ии DisableWindow ( hWnd ) EnableWindow ( hWnd ) Если ты работаешь все ТОЛЬКО через события, то их обработку можно блокировать ThisWindow.Object:lAction := .F. // .T. - вкл. назад This.Object:lAction := .F. // .T. :Event(..., {|ow| ow:lAction := .F., ... } что то поделал, закончил и опять включил ThisWindow.Object:lAction := .T. This.Object:lAction := .T. :Event(..., {|ow| ow:lAction := .F., ..., ow:lAction := .T. } И на форме всё скачет/бликует при прорисовке объектов. Сделай окну hide\minimize, можешь повесить другое окно-пустышку, вместо рабочего



полная версия страницы