Форум: "Прочее";
Текущий архив: 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; //<-- æäåì-ñ ïîêà ñäåëàþò Connect è ïðîäîëæèì çàíîâî, ñ âîçìîæíî äðóãîé ïàïêîé
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