Windows 98 как и Windows NT позволяет Вам установить аудит каталога с помощью функции FindFirstChangeNotification. Вот она:
HANDLE FindFirstChangeNotification
(
LPCTSTR lpPathName, // путь к каталогу
BOOL bWatchSubtree, // флаг управления
DWORD dwNotifyFilter// флаги событий
);
С первым параметром понятно. Флагом управления может быть значение TRUE или FALSE. От него зависит будут ли события генерироваться только для каталога FALSE или для каталога и всех подкаталогов - TRUE. Второй параметр это флаги, с помощью которых можно установить типы событий, на которых будет генерироваться событие.
FILE_NOTIFY_CHANGE_FILE_NAME | Изменение имен файлов, расположенных в указанном каталоге и его подкаталогах, создание и удаление файлов |
FILE_NOTIFY_CHANGE_DIR_NAME | Изменение имен каталогов, создание и удаление каталогов |
FILE_NOTIFY_CHANGE_ATTRIBUTES | Изменение атрибутов |
FILE_NOTIFY_CHANGE_SIZE | Изменение размеров файлов (после записи содержимого внутренних буферов на диск) |
FILE_NOTIFY_CHANGE_LAST_WRITE | Изменение времени записи для файлов (после записи содержимого внутренних буферов на диск) |
FILE_NOTIFY_CHANGE_SECURITY | Изменение дескриптора защиты |
Давате попробуем. Делайте приложение на основе MFC AppWizard на базе диалогового окна с одной кнопкой. При нажатии на эту кнопку будет устанавливаться аудит.
void CTestNotDlg::OnButton1()
{
HANDLE hDir;
hDir=FindFirstChangeNotification("c:\\Test1\\",
TRUE,FILE_NOTIFY_CHANGE_FILE_NAME);
if (hDir==INVALID_HANDLE_VALUE)
AfxMessageBox("Не могу следить за каталогом");
while (WaitForSingleObject(hDir,10000)!=WAIT_OBJECT_0)
{
}
AfxMessageBox("с каталогом работают");
FindCloseChangeNotification(hDir);
}
Мы создали указатель на объект каталога, аудит которого будем проводить FindFirstChangeNotification(), а потом ждем сообщения от каталога WaitForSingleObject при его получении выводим сообщение на экран и закрываем указатель FindCloseChangeNotification().
BOOL FindCloseChangeNotification
(
HANDLE hChangeHandle// указатель на объект
);
Если нужно следить постоянно, например, чтобы вести LOG файл, то нужно вызывать функцию:
BOOL FindNextChangeNotification
{
HANDLE hChangeHandle// указатель на объект
);
Для получения информации о следующем событии. Эта функция переводит объект в первоначальное состояние и им можно пользоваться в дальнейшем для обнаружения сообщений. Если Вы внимательно посмотрели код, то увидели, что функция FindFirstChangeNotification() не получает сообщение, а только создает объект, которому эти сообщения будут посланы.