Реакция на изменение файла
От: Geronimo Россия  
Дата: 01.04.02 08:50
Оценка:
Hello, уважаемый All.
Есть одна прога, которая правит файл.
Нужно из другой проги, отловить, что файл изменился и перечитать его.
Все время опрашивать нет желания.
Подскажите есть какой нибудь action.
Re: Реакция на изменение файла
От: Lexey Россия  
Дата: 01.04.02 10:16
Оценка: 2 (1) +1
Здравствуйте Geronimo, Вы писали:

G>Hello, уважаемый All.

G>Есть одна прога, которая правит файл.
G>Нужно из другой проги, отловить, что файл изменился и перечитать его.
G>Все время опрашивать нет желания.
G>Подскажите есть какой нибудь action.

См. FindFirstChangeNotification
"Будь достоин победы" (c) 8th Wizard's rule.
Re[2]: Реакция на изменение файла
От: Аноним  
Дата: 19.08.08 01:28
Оценка:
Здравствуйте, Lexey, Вы писали:

L>Здравствуйте Geronimo, Вы писали:


G>>Hello, уважаемый All.

G>>Есть одна прога, которая правит файл.
G>>Нужно из другой проги, отловить, что файл изменился и перечитать его.
G>>Все время опрашивать нет желания.
G>>Подскажите есть какой нибудь action.

L>См. FindFirstChangeNotification


Разве FindFirstChangeNotification работает для отдельного файла, помоему только для директории. Есть ли анолог для файла?
Re: Реакция на изменение файла
От: x64 Россия http://x64blog.name
Дата: 19.08.08 04:53
Оценка:
ReadDirectoryChangesW()
JID: x64j@jabber.ru
Re[3]: Реакция на изменение файла
От: x64 Россия http://x64blog.name
Дата: 19.08.08 04:55
Оценка:
А>Разве FindFirstChangeNotification работает для отдельного файла, помоему только для директории. Есть ли анолог для файла?

Если реально надо только и исключительно для одного файла, тогда только файловый фильтр (драйвер). Но ты уверен что оно тебе надо?
JID: x64j@jabber.ru
Re: Реакция на изменение файла
От: MShura  
Дата: 19.08.08 05:08
Оценка:
G>Есть одна прога, которая правит файл.
G>Нужно из другой проги, отловить, что файл изменился и перечитать его.
G>Все время опрашивать нет желания.
G>Подскажите есть какой нибудь action.

Попробуй журнал изменений на NTFS
MSDN
http://msdn.microsoft.com/en-us/library/aa363798(VS.85).aspx
Подробнее
http://technet.microsoft.com/en-us/library/bb742450(TechNet.10).aspx
Реакция на изменение файла
От: Юрий Жмеренецкий ICQ 380412032
Дата: 19.08.08 07:45
Оценка: 6 (3) +1
#Имя: FAQ.winapi.SHChangeNotifyRegister
Здравствуйте, x64, Вы писали:

А>>Разве FindFirstChangeNotification работает для отдельного файла, помоему только для директории. Есть ли анолог для файла?


x64>Если реально надо только и исключительно для одного файла, тогда только файловый фильтр (драйвер).


Исключительно для файла можно так:

#define SHCNRF_ShellLevel 0x0002
#define WM_FILE_CHANGED WM_USER + 100

ULONG g_cookie = 0;

// WndProc 
  case WM_CREATE:
  {
    LPITEMIDLIST pidl = NULL;
    HRESULT hr = ::SHParseDisplayName(L"c:\\temp\\1.txt", NULL, &pidl, SFGAO_FILESYSTEM, NULL);
    if(SUCCEEDED(hr))
    {
      SHChangeNotifyEntry entry = { pidl, FALSE };
    
      g_cookie = ::SHChangeNotifyRegister(hWnd, SHCNRF_ShellLevel, 
        SHCNE_ALLEVENTS, WM_FILE_CHANGED, 1, &entry);
      ::CoTaskMemFree(pidl);
      
      if(g_cookie == 0)
      {
        // error
      }
    }
  }break;
    
    
  case WM_DESTROY:
  {
    if(g_cookie)
      SHChangeNotifyDeregister(g_cookie);
    PostQuitMessage(0);
  }break;
    
  case WM_FILE_CHANGED:
  {
    MessageBox(hWnd, L"WM_FILE_CHANGED",0,0);
  }break;

+CoInitialize.
Вместо SHCNE_ALLEVENTS можно использовать другие флаги(см. SHChangeNotify)
shchangenotifyregister
Re[5]: Реакция на изменение файла
От: x64 Россия http://x64blog.name
Дата: 19.08.08 10:19
Оценка: 3 (1) -4 :)))
ЮЖ>Исключительно для файла можно так:

Фи, ради каких-то уведомлений целый COM поднимать! Не, пасиба, нинада, драйверок и то проще накатать.
JID: x64j@jabber.ru
Re[6]: Реакция на изменение файла
От: Юрий Жмеренецкий ICQ 380412032
Дата: 19.08.08 11:11
Оценка: 1 (1)
Здравствуйте, x64, Вы писали:

ЮЖ>>Исключительно для файла можно так:


x64>Фи, ради каких-то уведомлений целый COM поднимать! Не, пасиба, нинада, драйверок и то проще накатать.


Я просто другой способ показал.
Кстати, система shell notification и так всегда работает, нужно только подписаться
на уведомления, которые могут быть не только от объектов файловой системы. Можно
наблюдать за любыми объектами в shell namespace, включая "Корзину",Панель управления
и т.п. Так же можно ловить уведомления типа таких:

SHCNE_NETSHARE
A folder on the local computer is being shared via the network

SHCNE_SERVERDISCONNECT
The computer has disconnected from a server

SHCNE_DRIVEADD
A drive has been added.


Кроме того, есть следующая бесплатная возможность:

For performance reasons, multiple notifications may be combined into a
single notification. For example, if a large number of SHCNE_UPDATEITEM notifications
are generated for files in the same folder, they can be joined
into a single SHCNE_UPDATEDIR notification.


PS: Имхо, shell и драйвера ортогональны.
shchangenotifyregister
Re: Реакция на изменение файла
От: rusted Беларусь  
Дата: 04.02.09 20:55
Оценка: 6 (1)
Здравствуйте, Юрий Жмеренецкий, Вы писали:

ЮЖ>Исключительно для файла можно так:


ЮЖ>
ЮЖ>... SHChangeNotifyRegister ...
ЮЖ>


Почему-то оповещения не всегда приходят — к примеру если файл сохраняется из notepad-а то приходит, а если из visual studio — то нет. И еще задержка между моментом сохранения и приходом оповещения какая-то уж слишком большая.
Re[2]: Реакция на изменение файла
От: Юрий Жмеренецкий ICQ 380412032
Дата: 05.02.09 02:11
Оценка:
Здравствуйте, rusted, Вы писали:

R>Здравствуйте, Юрий Жмеренецкий, Вы писали:


ЮЖ>>Исключительно для файла можно так:


ЮЖ>>
ЮЖ>>... SHChangeNotifyRegister ...
ЮЖ>>


R>Почему-то оповещения не всегда приходят — к примеру если файл сохраняется из notepad-а то приходит, а если из visual studio — то нет.


А с такими флагами: SHCNRF_ShellLevel | SHCNRF_InterruptLevel ?
Re[3]: Реакция на изменение файла
От: rusted Беларусь  
Дата: 05.02.09 18:19
Оценка:
Здравствуйте, Юрий Жмеренецкий, Вы писали:

ЮЖ>А с такими флагами: SHCNRF_ShellLevel | SHCNRF_InterruptLevel ?


не помогло.
Re[4]: Реакция на изменение файла
От: Юрий Жмеренецкий ICQ 380412032
Дата: 05.02.09 19:37
Оценка:
Здравствуйте, rusted, Вы писали:

R>Здравствуйте, Юрий Жмеренецкий, Вы писали:


ЮЖ>>А с такими флагами: SHCNRF_ShellLevel | SHCNRF_InterruptLevel ?


R>не помогло.


Как тут выяснилось, уведомления об изменении размера приходят только в том случае, если после изменения файла был сделан(прямо или косвенно) вызов SHChangeNotify (SHCNE_UPDATEITEM...). WriteFile сотоварищи этого естественно не делают. Кроме того, shell notification механизм для отслеживания действий над filesystem объектами использует FindFirstChangeNotification (и т.п функциях слежения за папками) и не транслирует изменения файлов в вызовы SHChangeNotify для них.

Так что этот метод плохо подходит для мониторинга файлов, здесь я ошибался. Можно следить за папками, в этом случае уведомления приходят.
Re[5]: Реакция на изменение файла
От: rusted Беларусь  
Дата: 07.02.09 17:15
Оценка:
Здравствуйте, Юрий Жмеренецкий, Вы писали:

ЮЖ>Как тут выяснилось, уведомления об изменении размера приходят только в том случае, если после изменения файла был сделан(прямо или косвенно) вызов SHChangeNotify (SHCNE_UPDATEITEM...). WriteFile сотоварищи этого естественно не делают. Кроме того, shell notification механизм для отслеживания действий над filesystem объектами использует FindFirstChangeNotification (и т.п функциях слежения за папками) и не транслирует изменения файлов в вызовы SHChangeNotify для них.


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


раз уж готового решеия не нашлось, сделал свое — http://www.rsdn.ru/forum/message/3282352.aspx
Автор: rusted
Дата: 07.02.09
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.