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
|
|
|