информационная безопасность
без паники и всерьез
 подробно о проектеRambler's Top100
Сетевые кракеры и правда о деле ЛевинаПортрет посетителяГде водятся OGRы
BugTraq.Ru
Русский BugTraq
 Анализ криптографических сетевых... 
 Модель надежности двухузлового... 
 Специальные марковские модели надежности... 
 Очередное исследование 19 миллиардов... 
 Оптимизация ввода-вывода как инструмент... 
 Зловреды выбирают Lisp и Delphi 
главная обзор RSN блог библиотека закон бред форум dnet о проекте
bugtraq.ru / форум / programming
Имя Пароль
если вы видите этот текст, отключите в настройках форума использование JavaScript
ФОРУМ
все доски
FAQ
IRC
новые сообщения
site updates
guestbook
beginners
sysadmin
programming
operating systems
theory
web building
software
hardware
networking
law
hacking
gadgets
job
dnet
humor
miscellaneous
scrap
регистрация





Легенда:
  новое сообщение
  закрытая нитка
  новое сообщение
  в закрытой нитке
  старое сообщение
это да, все, что имеет смысл тут делать - свистеть соседнему потоку 07.08.07 16:27  Число просмотров: 2419
Автор: 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-2025 Dmitry Leonov   Page build time: 0 s   Design: Vadim Derkach