Внимание: в папку C:\temp скопирован файл
поскажите пожалуйста, как узнать (постоянно не сканируя), что в определенную папку был скопирован файл. Насколько я понимаю винда посылает всем процесса какое то сообщение. Какое?
Возможно тебе помогут функции FileIOCompletionRoutine, MsgWaitForMultipleObjectsEx и WaitForMultipleObjectsEx посмотри их описание в MSDN.
(в NT функций поболее, но и в Win98 работает)
Когда запускаю цикл на опрос - все равно программа забирает на себя все ресурсы, а мне надо чтобы оно спало, пока что нибудь не случиться
Дык и не надо цикл запускать. Зарегестрировал в системе каталог, зва ктрм тебе нужно следить, подал ей свою функцию - система ее и вызовет - когда пройзойдут изменения.
вот пример моего "базового" класса
(функция SayAboutChange переопределяется для каждой конкретной реализации)
//---------------------------------------------------------------------------
void __fastcall TDirChange::Execute()
{
if(path=="-") Terminate();//!!!
HANDLE hSubstDirChange= FindFirstChangeNotification(path.c_str(),subTree,flag);
if(hSubstDirChange!=INVALID_HANDLE_VALUE)
{ while(!Terminated)
{ WaitForSingleObject(hSubstDirChange,INFINITE);
Synchronize(SayAboutChange);
FindNextChangeNotification(hSubstDirChange);
}
FindCloseChangeNotification(hSubstDirChange);
}
else { DWORD er=GetLastError();
char buf[256];
er=FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM,//0,// DWORD dwFlags, // source and processing options
NULL,// LPCVOID lpSource, // pointer to message source
er,// DWORD dwMessageId, // requested message identifier
0,// DWORD dwLanguageId, // language identifier for requested message
buf,// LPTSTR lpBuffer, // pointer to message buffer
255,// DWORD nSize, // maximum size of message buffer
NULL// va_list *Arguments // address of array of message inserts
);
ShowMessage("Ошибка потока "+path+":\n"+AnsiString(buf));
}
Terminate();
}
Да вот еще проблема - почему уведомление приходит дважды. То есть обработчик срабатывает 2 раза
У меня такой проблемы нет.
Посмотри внимательнее на флаги функции FindFirstChangeNotification (каталог/подкаталоги и т.п.) - возможно происходит событие,ктр "узнается" по нескольким критериям - соответственное кол-во раз и обработчик дергается...
Но проблему я решил
Вместо
FindNextChangeNotification(hSubstDirChange);
пишу
FindNextChangeNotification(hSubstDirChange);
FindNextChangeNotification(hSubstDirChange);
и все
А как сказать этой функции что бы она перестала ждать и при этом ничего не делать с наблюдаемой папкой. А то я не могу остановить сервис
Не знаю как ты инициализируешь это все. Я же, если ты заметил по коду, использую это все в отдельном Thread-е, соответственно и юзаю функции ТThread-а:
Terminate() и Suspend()