Реакция на изменение файла
От: Юрий Жмеренецкий 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
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.