Венда? Если да, то там в Kernel32 живёт ReadDirectoryChanges, вам туда.06.08.07 10:03 Число просмотров: 2849 Автор: HandleX <Александр М.> Статус: The Elderman
В фолдер периодически копируются некоторые файлы. Надо периодически "просматривать" этот фолдер, и (если скопировано то что требуется), выполнять процесинг некоторых файлов. Как это сделать лучше, чем просто тупо по таймеру (например, раз в минуту) просматривать фолдер.
Спасибо.
Венда? Если да, то там в Kernel32 живёт ReadDirectoryChanges, вам туда.06.08.07 10:03 Автор: HandleX <Александр М.> Статус: The Elderman
if ( Buffer[0].Action == FILE_ACTION_ADDED)
_tprintf(_T("Added %s\n"), Buffer[0].FileName);
else if ( Buffer[0].Action == FILE_ACTION_MODIFIED)
_tprintf(_T("Modified %s\n"), Buffer[0].FileName);
// to do ...
//Sleep(1000);
::ZeroMemory(Buffer, sizeof(Buffer));
}
CloseHandle(hDir);
Там где закоментировано // to do ...//Sleep(1000); обработка не может быть длительной. Иначе винда сигналит о 2-3 файлах из 10 и "забывает" просигналить об остальных.
Если Sleep(1000); закоментировано, то винда честно сигналит о всей пачке новых файлов.
Возможно асинхронный вызов ReadDirectoryChangesW с сигналом на IOCP поможет. Не знаю.
или FindFirstChangeNotification06.08.07 13:05 Автор: dl <Dmitry Leonov> Отредактировано 06.08.07 13:26 Количество правок: 1
> Она чуть переносимее, но отдает меньше информации. Спасибо за совет. Я попробовал. Единственно, что смущает, это то что обработка файлов - "кандидатов на процессинг" должна быть достаточно быстрая (и конечно в отдельном потоке) :
while (WAIT_OBJECT_0 == WaitForSingleObject(dwChangeHandle, INFINITE))
{
_tprintf(TEXT("A file is added\\changed\\deleted\n"));
if ( FindNextChangeNotification( dwChangeHandle ) == FALSE ) ExitProcess(GetLastError());
// to do ...
//Sleep(1000);
}
CloseHandle(dwChangeHandle);
Если же там где закоментирован //Sleep(1000); обработка длительная, то вместо скажем 10 новых файлов (из них меня интересует только один) FindNextChangeNotification просигналит только об 2-3. Число файлов о которых сигнализирует винда - получается негарантируемым. Это зависит от нагруженности компа и I/O, думаю. Результаты "пропуска" нотификации, что нужный файл появился - катастрофа.
это да, все, что имеет смысл тут делать - свистеть соседнему потоку07.08.07 16:27 Автор: dl <Dmitry Leonov>