Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2008.08.17;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.55 MB
Время: 0.069 c
1-1196691015
antonn
2007-12-03 17:10
2008.08.17
авторизация в Novell


15-1214923574
pasha_golub
2008-07-01 18:46
2008.08.17
Отлов MemLeak ов


2-1216197740
Костик
2008-07-16 12:42
2008.08.17
Как потушить монитор?


2-1215761892
Костик
2008-07-11 11:38
2008.08.17
Помогите написать "Уведомлятель"


15-1214883321
Slider007
2008-07-01 07:35
2008.08.17
С днем рождения ! 1 июля 2008 вторник





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский