C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
FindFirstChangeNotification, известить программу об измен. сост катал
Grigoriy
Отправлено: 05.07.2006, 04:53


Мастер участка

Группа: Участник
Сообщений: 381



Есть АПИ-функции
CODE

HANDLE FindFirstChangeNotification(
   LPCTSTR lpPathName, // pointer to name of directory to watch  
   BOOL bWatchSubtree, // flag for monitoring directory or directory tree  
   DWORD dwNotifyFilter  // filter conditions to watch for
  );
BOOL FindNextChangeNotification(
   HANDLE hChangeHandle  // handle to change notification to signal  
  );
BOOL FindCloseChangeNotification(
   HANDLE hChangeHandle  // handle to change notification to close  
  );

Они используются для того, чтобы ОС сигнализировала программе об изменеии состояния каталога (я так понял — изменение состояния происходит при изменении содержимого каталога). Но не все так просто.
Дело в том, что ОС должна вызвать какую-то функцию из множества Wait Functions. Эта функция должна обрабатывать изменения каталога.

В Помощи я нашел о них. Только не понял, должны они принадлежать самой программе или нет. И вообще что это за функции Wait Functions ?
Их нужно написать самому ?
Как задать их адреса ? В параметрах вышеописанных прототипов функций нет адресов Wait Functions.

Отредактировано Grigoriy — 05/07/2006, 04:54
AVC
Отправлено: 05.07.2006, 10:59


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE (Grigoriy @ 05/07/2006, 03:53)
Есть АПИ-функции
Они используются для того, чтобы ОС сигнализировала программе об изменеии состояния каталога (я так понял — изменение состояния происходит при изменении содержимого каталога). Но не все так просто.
Дело в том, что ОС должна вызвать какую-то функцию из множества Wait Functions. Эта функция должна обрабатывать изменения каталога.


Простая следилка за перечнем файлов в каталоге
Срабатывает при создании / удалении фалов
CODE

void __fastcall TForm1::Bt_FolderWatchClick(TObject *Sender)
{
static int watchstate = 0; // 0-stoped 1-active 2-prepare_to_stop
static HANDLE chan;

TBitBtn *btn = dynamic_cast<TBitBtn*>(Sender);

if (watchstate == 1)
{ FindCloseChangeNotification(chan);
watchstate = 0;
Memo1->Lines->Add("FolderWatch — stoped");
if (btn) btn->Font->Color = clWindowText;
return;
}
if (watchstate != 0) return;


AnsiString path = "F:\Temp";

chan = FindFirstChangeNotification(path.c_str(), false, FILE_NOTIFY_CHANGE_FILE_NAME);
if (chan == INVALID_HANDLE_VALUE) return;
Memo1->Lines->Add("FolderWatch — started");
watchstate = 1;
if (btn) btn->Font->Color = clRed;

while (watchstate == 1)
{ int stat = WaitForSingleObject(chan, 500);
switch(stat)
{ case WAIT_OBJECT_0:
Memo1->Lines->Add("FolderWatch — file name changed");
if (!FindNextChangeNotification(chan)) watchstate = 2;
break;

case WAIT_TIMEOUT:
// Memo1->Lines->Add("FolderWatch — timeout");
break;

case WAIT_ABANDONED:
default:
Memo1->Lines->Add("FolderWatch — abandoned");
watchstate = 2;
break;
}
if (watchstate == 1)
{ Update();
Application->ProcessMessages();
}
}

if (watchstate == 2)
{ watchstate = 1;
Bt_FolderWatchClick(Sender);
}

}


Отредактировано AVC — 05/07/2006, 10:01
Gedeon
Отправлено: 05.07.2006, 11:45


Ветеран

Группа: Модератор
Сообщений: 1742



странно, в МСДН все прекрасно описано, вот пример оттуда
CODE

#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <tchar.h>

void RefreshDirectory(LPTSTR);
void RefreshTree(LPTSTR);

void WatchDirectory(LPTSTR lpDir)
{
  DWORD dwWaitStatus;
  HANDLE dwChangeHandles[2];
  TCHAR lpDrive[4];
  TCHAR lpFile[_MAX_FNAME];
  TCHAR lpExt[_MAX_EXT];

  _tsplitpath(lpDir, lpDrive, NULL, lpFile, lpExt);

  lpDrive[2] = (TCHAR)'\\';
  lpDrive[3] = (TCHAR)'\0';

// Watch the directory for file creation and deletion.

  dwChangeHandles[0] = FindFirstChangeNotification(
     lpDir,                         // directory to watch
     FALSE,                         // do not watch subtree
     FILE_NOTIFY_CHANGE_FILE_NAME); // watch file name changes

  if (dwChangeHandles[0] == INVALID_HANDLE_VALUE)
     ExitProcess(GetLastError());

// Watch the subtree for directory creation and deletion.

  dwChangeHandles[1] = FindFirstChangeNotification(
     lpDrive,                       // directory to watch
     TRUE,                          // watch the subtree
     FILE_NOTIFY_CHANGE_DIR_NAME);  // watch dir. name changes

  if (dwChangeHandles[1] == INVALID_HANDLE_VALUE)
     ExitProcess(GetLastError());

// Change notification is set. Now wait on both notification
// handles and refresh accordingly.

  while (TRUE)
  {
  // Wait for notification.

     dwWaitStatus = WaitForMultipleObjects(2, dwChangeHandles,
        FALSE, INFINITE);

     switch (dwWaitStatus)
     {
        case WAIT_OBJECT_0:

        // A file was created or deleted in the directory.
        // Refresh this directory and restart the notification.

           RefreshDirectory(lpDir);
           if ( FindNextChangeNotification(
                   dwChangeHandles[0]) == FALSE )
               ExitProcess(GetLastError());
           break;

        case WAIT_OBJECT_0 + 1:

        // A directory was created or deleted in the subtree.
        // Refresh the tree and restart the notification.

           RefreshTree(lpDrive);
           if (FindNextChangeNotification(
                   dwChangeHandles[1]) == FALSE)
               ExitProcess(GetLastError());
           break;

       default:
           ExitProcess(GetLastError());
     }
  }
}

void RefreshDirectory(LPTSTR lpDir)
{
  _tprintf(TEXT("Refresh the directory (%s).\n"), lpDir);
}

void RefreshTree(LPTSTR lpDrive)
{
  _tprintf(TEXT("Refresh the directory tree (%s).\n"), lpDrive);
}

An application can monitor the contents of a directory and its subdirectories by using change notifications. Waiting for a change notification is similar to having a read operation pending against a directory and, if necessary, its subdirectories. When something changes within the directory being watched, the read operation is completed. For example, an application can use these functions to update a directory listing whenever a file name within the monitored directory changes.

Gedeon
Отправлено: 05.07.2006, 12:34


Ветеран

Группа: Модератор
Сообщений: 1742



собственно ссылка в инете
http://msdn.microsoft.com/library/default....otification.asp
а вот и wait functions
http://msdn.microsoft.com/library/en-us/wc...itFunctions.asp

Вернуться в Вопросы программирования в C++Builder