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





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
  • Напоминаю, что масса вопросов по функционированию форума снимается после прочтения его описания.
  • Новичкам также крайне полезно ознакомиться с данным документом.
это да, все, что имеет смысл тут делать - свистеть соседнему потоку 07.08.07 16:27  Число просмотров: 2294
Автор: dl <Dmitry Leonov>
<"чистая" ссылка>
<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: 0 s   Design: Vadim Derkach