Легенда:
новое сообщение
закрытая нитка
новое сообщение
в закрытой нитке
старое сообщение
|
- Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
- Новичкам также крайне полезно ознакомиться с данным документом.
 |
Венда? Если да, то там в Kernel32 живёт ReadDirectoryChanges, вам туда. 06.08.07 10:03 Число просмотров: 2815
Автор: HandleX <Александр М.> Статус: The Elderman
|
|
<programming>
|
Монитор фолдера 06.08.07 07:53
Автор: void <Grebnev Valery> Статус: Elderman
|
В фолдер периодически копируются некоторые файлы. Надо периодически "просматривать" этот фолдер, и (если скопировано то что требуется), выполнять процесинг некоторых файлов. Как это сделать лучше, чем просто тупо по таймеру (например, раз в минуту) просматривать фолдер.
Спасибо.
|
 |
Венда? Если да, то там в Kernel32 живёт ReadDirectoryChanges, вам туда. 06.08.07 10:03
Автор: HandleX <Александр М.> Статус: The Elderman
|
|
 |  |
Спасибо. Я попробовал такой тестовый код: 07.08.07 03:40
Автор: void <Grebnev Valery> Статус: Elderman
|
Спасибо. Я попробовал такой тестовый код:
HANDLE hDir = CreateFile ( lpDir, FILE_LIST_DIRECTORY, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL);
if (INVALID_HANDLE_VALUE == hDir)
{
_tprintf(TEXT("Error opening the directory (%s) (error code: %d).\n"), lpDir, ::GetLastError());
return;
}
FILE_NOTIFY_INFORMATION Buffer[1024];
::ZeroMemory(Buffer, sizeof(Buffer));
DWORD BytesReturned;
while (ReadDirectoryChangesW( hDir, Buffer, sizeof(Buffer), FALSE,
FILE_NOTIFY_CHANGE_FILE_NAME, // | FILE_NOTIFY_CHANGE_LAST_WRITE,
&BytesReturned, NULL, NULL ))
{
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 поможет. Не знаю.
|
 |  |
или FindFirstChangeNotification 06.08.07 13:05
Автор: dl <Dmitry Leonov> Отредактировано 06.08.07 13:26 Количество правок: 1
|
Она чуть переносимее, но отдает меньше информации.
|
 |  |  |
Спасибо за совет. Я попробовал. Единственно, что смущает,... 07.08.07 03:30
Автор: void <Grebnev Valery> Статус: Elderman
|
> Она чуть переносимее, но отдает меньше информации. Спасибо за совет. Я попробовал. Единственно, что смущает, это то что обработка файлов - "кандидатов на процессинг" должна быть достаточно быстрая (и конечно в отдельном потоке) :
HANDLE dwChangeHandle;
if ( INVALID_HANDLE_VALUE == (dwChangeHandle = FindFirstChangeNotification( lpDir, FALSE, FILE_NOTIFY_CHANGE_FILE_NAME)) )
ExitProcess(GetLastError());
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>
|
|
|
|