Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.08.17;
Скачать: CL | DM;

Вниз

FileWatcher+Sort   Найти похожие ветки 

 
VirEx ©   (2008-06-08 21:38) [40]


>  [38] Тын-Дын ©   (08.06.08 21:33)
> Кстати, Верхне-Сысертский пруд водой заполнили?

Незнаю, я там один раз был за семь лет.


 
VirEx ©   (2008-06-28 21:08) [41]

отказался я от идеи c ReadDirectoryChanges
вопрос такой: что лучше, сделать таймер или проверять папки на наличие новых файлов в потоке?


 
Тын-Дын ©   (2008-06-28 21:18) [42]


> VirEx ©   (28.06.08 21:08) [41]
>
> отказался я от идеи c ReadDirectoryChanges
> вопрос такой: что лучше, сделать таймер или проверять папки
> на наличие новых файлов в потоке?


Так и непонятно, что устроило, что не устроило при выборе из нескольких вариантов.


 
VirEx ©   (2008-06-28 21:42) [43]

вобщем исходя из специфики:
1. папок за которыми будет "слежка" будет много, от 10-15 (поэтому ReadDirectoryChanges не подходит, приходится держать открытым много хэндлов)
2. файлы сканируются не только через маску но и через сигнатуры (к примеру по смещению 0 два символа PK это обычно zip архив, ну и т.п.)
3. счас не вспомнить всё :)
для универсальности придумал такую логику:
создаются ТРЕКи (пути "обработки"), каждый состоит из:
 1.список папок за которыми нужно следить
 2.список папок  - назначение
 3.список масок и сигнатур, которые будут фильтром для 1.
 4.операция символизирующая данный ТРЕК (копировать, переместить, удалить и т.п.)

пример треков:
1.мониторные папки: c:\1 c:\2 c:\3
2.папки назначения: d:\out f:\tmp
3.типы файлов: *.log; *log*.txt; *.rep; (логи)
4.операция: переместить

1.мониторные папки: c:\5
2.папки назначения: c:\1
3.типы файлов: *.zip; сигнатура (с нулевой позиции сигнатура "Rar!") (архивы)
4.операция: запустить unrar.exe [параметры]

так вот, вопрос в том, как лучше мониторить папки:
1. создать нить-таймер, и проверять
2. создать обычный таймер через SetTimer и сканить мониторные папки


 
Игорь Шевченко ©   (2008-06-28 21:47) [44]


> так вот, вопрос в том, как лучше мониторить папки


ReadDirectoryChangesW


 
Тын-Дын ©   (2008-06-28 21:59) [45]


> VirEx ©   (28.06.08 21:42) [43]


В принципе, как сделаешь, так и будет работать.
Я бы сделал отдельный поток для каждого каталога.
Если реагировать нужно на появление файлов в пустых каталогах, то восользовался бы кодом, который я тебе высылал.


 
Zeqfreed ©   (2008-06-28 23:18) [46]

> VirEx ©   (28.06.08 21:42) [43]

Как будто для сканирования папки не нужно открывать дескриптор.


 
VirEx ©   (2008-06-29 07:05) [47]


> [44] Игорь Шевченко ©   (28.06.08 21:47)

в конце предложения стит двоеточие, что означает выбор


>  [46] Zeqfreed ©   (28.06.08 23:18)

ну одно дело держать открытым 10-15 дескрипторов, другое дело по таймеру создается на мнгновение дескриптор и убивается

меня что смущает то в CreateFile: не всегда получается, да и толком непонятно как корректно отлавливать события удаления мониторной папки с файлами, либо внезапную "потерю" мониторной папки если она была сетевой (сеть отрубилась, закрыли расшаренный диск и т.п.)

если на удаление пустой мониторной папки событие прекрасно обрабатывается, то вышеперечисленные события вобще даже не "возбуждаются":

procedure TWFS.Execute;
var
 CompletionKey: Cardinal;
begin
 ZeroMemory(@FWatchBuf, SizeOf(FWatchBuf));
 if not ReadDirectoryChanges(FWatchHandle, @FWatchBuf, SizeOf(FWatchBuf), FSubTree,
   FFilter, @FBytesWritte, @FOverLapp, nil) then
 begin
   raise WFSError.Create(SysErrorMessage(GetLastError));
   Disconnect;
 end else
 begin
   while FActive do
   begin
     GetQueuedCompletionStatus(FCompletionPort, FNumBytes, CompletionKey, FPOverLapp, INFINITE);
     if Assigned(FPOverLapp) then
       if (TOverlapped(FPOverLapp^).Internal = $C0000056) or //ïóñòóþ ïàïêó óäàëèëè, âûðóáàåìñè
         (CompletionKey = 0) //òóò âîáùå æóòü òâîðèòñÿ
         then begin
         Disconnect;
         Suspend; //<-- &#230;&#228;&#229;&#236;-&#241; &#239;&#238;&#234;&#224; &#241;&#228;&#229;&#235;&#224;&#254;&#242; Connect &#232; &#239;&#240;&#238;&#228;&#238;&#235;&#230;&#232;&#236; &#231;&#224;&#237;&#238;&#226;&#238;, &#241; &#226;&#238;&#231;&#236;&#238;&#230;&#237;&#238; &#228;&#240;&#243;&#227;&#238;&#233; &#239;&#224;&#239;&#234;&#238;&#233;
         ReadDirectoryChanges(FWatchHandle, @FWatchBuf, SizeOf(FWatchBuf), FSubTree, FFilter, @FBytesWritte, @FOverLapp, nil);
       end else begin
         Synchronize(HandleEvent);
         ZeroMemory(@FWatchBuf, SizeOf(FWatchBuf));
         FBytesWritte := 0;
         ReadDirectoryChanges(FWatchHandle, @FWatchBuf, SizeOf(FWatchBuf), FSubTree, FFilter, @FBytesWritte, @FOverLapp, nil);
       end;
   end
 end;
end;


 
Игорь Шевченко ©   (2008-06-29 13:51) [48]

VirEx ©   (29.06.08 07:05) [47]


> в конце предложения стит двоеточие, что означает выбор


Для мониторинга есть ReadDirectoryChangesW, все остальное либо хуже, либо неудобнее, либо не соответствует мониторингу.


 
Riply ©   (2008-06-29 14:13) [49]

> [48] Игорь Шевченко ©   (29.06.08 13:51)
> Для мониторинга есть ReadDirectoryChangesW, все остальное либо хуже,
> либо неудобнее, либо не соответствует мониторингу.

Вот сидит у меня в голове, что при достаточно большом количестве
изменений в единицу времени, ReadDirectoryChangesW может пропускать некоторые (не возвращать).
Откуда я это взяла - не помню, а проверить никак руки не доходят :(

Это так или я ошибаюсь ?


 
Игорь Шевченко ©   (2008-06-29 15:56) [50]


> Это так или я ошибаюсь ?

http://msdn.microsoft.com/en-us/library/aa365465(VS.85).aspx



Страницы: 1 2 вся ветка

Текущий архив: 2008.08.17;
Скачать: CL | DM;

Наверх




Память: 0.56 MB
Время: 0.018 c
15-1214651627
@!!ex
2008-06-28 15:13
2008.08.17
Plugin для браузера сворачивающий в трей


15-1214991525
Дебил какой-то
2008-07-02 13:38
2008.08.17
Где же винда хранит пароли от интернета ?


2-1216017284
User
2008-07-14 10:34
2008.08.17
ShellTreeView, ShellListView, имя директории и оптимизация кода


2-1216116471
Костик
2008-07-15 14:07
2008.08.17
как определить координаты?


15-1213957352
AlexDan
2008-06-20 14:22
2008.08.17
Полетел принтер..