информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
За кого нас держат?Страшный баг в WindowsГде водятся OGRы
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Бэкдор в xz/liblzma, предназначенный... 
 Три миллиона электронных замков... 
 Doom на газонокосилках 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
ФОРУМ
если вы видите этот текст, отключите в настройках форума использование JavaScript
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
Венда? Если да, то там в Kernel32 живёт ReadDirectoryChanges, вам туда. 06.08.07 10:03  Число просмотров: 2711
Автор: 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>
<"чистая" ссылка>
1




Rambler's Top100
Рейтинг@Mail.ru


  Copyright © 2001-2024 Dmitry Leonov   Page build time: 1 s   Design: Vadim Derkach