Форум: "Прочее";
Текущий архив: 2008.08.17;
Скачать: [xml.tar.bz2];
ВнизFileWatcher+Sort Найти похожие ветки
← →
VirEx © (2008-06-07 20:02) [0]Подскажите, может кто знает хороший сортировщик, следящий за папкой и при появлении файла, копирующий его по сигнатуре или хотябы по маске расширения и имени в нужные папки (и если надо, распаковывающий архивы, содержимое которых будет также раскидывать по папкам). Возможно выполненный в виде сервиса и юзерской формы настроек "сценария сортировки".
На пальцах:
1. в каталоге А появляется файлы DOC1.txt, DOC1xxx.txt, trace.log, DOC1.rar (внутри DOC2.txt, file.log, DOC2xxx.txt), и DOC5zzz.rar (1.xyz, 2.xyz)
2. все файлы с маской DOC?.txt в каталог Б, т.е. DOC1.txt DOC2.txt (распаковывается из архива)
3. все файлы с маской DOC?xxx.txt в каталог В: DOC1xxx.txt и DOC2xxx.txt (из архива)
4. все файлы *.log в папку Г: trace.log и file.log (из архива), при этом они из папки А удаляются
5. все файлы DOC????.rar в папку Д
6. каталог А будет "объектом" слежения программы сегодня, а завтра программа будет следить за папкой A2
← →
Тын-Дын © (2008-06-07 20:06) [1]
> VirEx © (07.06.08 20:02)
Так напиши. Али не программер?
Программа-то узкоспециализированная получается.
Ещё зависит от того, что за программа выкладывает эти файлы в каталог(каким методом идет запись).
← →
Игорь Шевченко © (2008-06-07 20:08) [2]ReadDirectoryChangesW тебе в помощь
← →
Тын-Дын © (2008-06-07 20:09) [3]ReadDirectoryChangesW+
Проверка на окончание записи файла
FindFirst/Next/Close/ChangeNotification
← →
VirEx © (2008-06-07 20:09) [4]
> [2] Игорь Шевченко © (07.06.08 20:08)
Сделал я свой FileWatcher давно уже.
Но ежели уже есть готовый продукт-велосипед, чего его изобретать?
Я знаю что не программер и хреново сделаю, опять, поэтому и спрашиваю
← →
Игорь Шевченко © (2008-06-07 20:11) [5]
> Проверка на окончание записи файлаconst
maxcnt = 360; //Ждем 6 минут максимум
var
fd: Integer;
ofs: _OFSTRUCT;
err: DWORD;
cnt: Integer;
begin
cnt := 0;
repeat
Inc(cnt);
FillChar(ofs, SizeOf(ofs), 0);
ofs.cBytes := SizeOf(ofs);
fd := OpenFile(PChar(FileName), ofs, OF_SHARE_EXCLUSIVE);
err := GetLastError;
if err <> ERROR_SHARING_VIOLATION then
Break;
Sleep(1000);
until cnt >= maxcnt;
CloseHandle(fd);
if err <> ERROR_SUCCESS then
raise Exception.Create(SysErrorMessage(err))
← →
anton773 (2008-06-07 20:11) [6]TFileWatcher? в примерах с делфи 2005 есть все, что тебе нужно
← →
Игорь Шевченко © (2008-06-07 20:11) [7]VirEx © (07.06.08 20:09) [4]
> Но ежели уже есть готовый продукт-велосипед, чего его изобретать?
Есть. Например мой. Успешно используется в течение 3 лет
← →
Тын-Дын © (2008-06-07 20:13) [8]
> Игорь Шевченко © (07.06.08 20:11) [5]
>
> > Проверка на окончание записи файла
Это подходит, но только знать надо, как запись в файл идёт.
Некоторые программы записывают порциями (прикладные, не системные), открывая и закрывая файл между записью порций.
← →
VirEx © (2008-06-07 20:15) [9]
> [6] anton773 (07.06.08 20:11)
> TFileWatcher? в примерах с делфи 2005 есть все, что тебе
> нужно
у меня дельфя 7я, сам искал примеры, и см. [4]
> [7] Игорь Шевченко © (07.06.08 20:11)
> Есть. Например мой. Успешно используется в течение 3 лет
в студию
← →
Игорь Шевченко © (2008-06-07 20:16) [10]Тын-Дын © (07.06.08 20:13) [8]
Если файл закрыт, то он свободен для использования. Я так полагаю.
А как действовать в случае, если программа периодически дописывает в файл, открывая его, дописывая и закрывая - если у тебя есть алгоритм, делись, буду признателен.
← →
anton773 (2008-06-07 20:17) [11]
> Игорь Шевченко © (07.06.08 20:11) [5]
> >
> > > Проверка на окончание записи файла
>
>
> Это подходит, но только знать надо, как запись в файл идёт.
>
> Некоторые программы записывают порциями (прикладные, не
> системные), открывая и закрывая файл между записью порций.
>
TFileWatcher то чем не угодил? Ведь уже готовый компонент? Имеет все что нужно.
← →
Игорь Шевченко © (2008-06-07 20:17) [12]VirEx © (07.06.08 20:15) [9]
> в студию
Часть коммерческого продукта, по отдельности не продается.
А чтобы купить продукт целиком, тебе сначала надо создать авиакомпанию.
← →
VirEx © (2008-06-07 20:18) [13]
> [12] Игорь Шевченко © (07.06.08 20:17)
как говорится, не себе не людям
← →
Игорь Шевченко © (2008-06-07 20:20) [14]VirEx © (07.06.08 20:18) [13]
Примерно так. Направление я тебе дал - ищи.
Ищущий да обрящет, прыгающий да допрыгается.
← →
Тын-Дын © (2008-06-07 20:20) [15]
> Игорь Шевченко © (07.06.08 20:16) [10]
> Тын-Дын © (07.06.08 20:13) [8]
>
> Если файл закрыт, то он свободен для использования. Я так
> полагаю.
> А как действовать в случае, если программа периодически
> дописывает в файл, открывая его, дописывая и закрывая -
> если у тебя есть алгоритм, делись, буду признателен.
Я давно тоже писал подобную программу для промышленной эксплуатации...
Но у меня файлы в каталог попадали тоже из моего приложения.
Как быть в случае записи по частям - не знаю.
Мне кажется, что надо оценить практически, сколько требуется времени на запись файла целиком в промышленных условиях и таймауты использовать с максимальным значением.
но это подойдет только если заранее известно, что фалы однотипные, рмаксимальный размер и т.п.
Слишком допущения большие...
← →
VirEx © (2008-06-07 20:21) [16]
> [14] Игорь Шевченко © (07.06.08 20:20)
тогда зачем заикался о своей программе, коли не даешь.
по сабжу спрашивается программа, не обязательно с исходниками
← →
Игорь Шевченко © (2008-06-07 20:22) [17]VirEx © (07.06.08 20:21) [16]
А ты халявы хотел ? А халявы нетути.
> по сабжу спрашивается программа, не обязательно с исходниками
ну я тебе сказал - создавай авиакомпанию, покупай наш продукт.
← →
Тын-Дын © (2008-06-07 20:23) [18]
> VirEx ©
Если найду старые разработки - очищу от лишнего и могу дать.
← →
Игорь Шевченко © (2008-06-07 20:24) [19]Тын-Дын © (07.06.08 20:20) [15]
> Но у меня файлы в каталог попадали тоже из моего приложения.
Свой со своим всегда договорится. Например, записав файл с заранее оговоренным расширением в заранее оговоренный каталог по полном окончании всей записи в обрабатываемый файл.
← →
Тын-Дын © (2008-06-07 20:26) [20]
> Свой со своим всегда договорится. Например, записав файл
> с заранее оговоренным расширением в заранее оговоренный
> каталог по полном окончании всей записи в обрабатываемый
> файл.
Это да. К тому же, когда файл захватывается для записи, то как раз код из [5] будет достаточен.
← →
VirEx © (2008-06-07 20:47) [21]
> [17] Игорь Шевченко © (07.06.08 20:22)
> VirEx © (07.06.08 20:21) [16]
>
> А ты халявы хотел ? А халявы нетути.
халява есть всегда, как и жлобства - хоть отбавляй
← →
VirEx © (2008-06-07 20:48) [22]
> [18] Тын-Дын © (07.06.08 20:23)
>
> > VirEx ©
>
>
> Если найду старые разработки - очищу от лишнего и могу дать.
был бы всенепременно рад
← →
Игорь Шевченко © (2008-06-07 21:13) [23]VirEx © (07.06.08 20:47) [21]
Ну ты же не хочешь писать и искать сам готовое. А моя работа стоит денег, как и любой продукт. Так что про жлобство лучше помалкивай.
← →
Германн © (2008-06-08 01:08) [24]
> Часть коммерческого продукта, по отдельности не продается.
>
> А чтобы купить продукт целиком, тебе сначала надо создать
> авиакомпанию.
>
Ходят слухи, что при оснастке 5-го терминала аэропорта Хитроу, авиакомпания British Airways установила в нём новое ПО. Фамилии разработчиков ПО, название фирмы-разработчика ПО и страна разработчика хранятся в секрете.
:)
← →
VirEx © (2008-06-08 08:23) [25]Всё еще жду помощи :(
← →
boa_kaa © (2008-06-08 09:25) [26]
> VirEx © (08.06.08 08:23) [25]
> Всё еще жду помощи :(
Переходи на .NET, не нужны будут сторонние компоненты
← →
tesseract © (2008-06-08 10:13) [27]
> Переходи на .NET, не нужны будут сторонние компоненты
devexpress по любому надо ставить :-)
← →
Тын-Дын © (2008-06-08 15:36) [28]
> VirEx ©
Давай немного подробнее о задаче?
1. Критично ли время реакции обработчика на появление файла в каталоге?
2. Будут ли мониториться на появление файлов сетевые диски?
← →
VirEx © (2008-06-08 17:49) [29]1. некритично.
2. да, и мониторная папка также может задаваться так: \\comp\d\
к тому же файлы допустим будет сохранять в мониторную папку TheBat! или команда copy
← →
Тын-Дын © (2008-06-08 17:58) [30]3. Размер файлов какой может быть?
← →
VirEx © (2008-06-08 17:59) [31]впринципе максимум 50 Мб
← →
icelex © (2008-06-08 18:45) [32]
> tesseract © (08.06.08 10:13) [27]
> > Переходи на .NET, не нужны будут сторонние компоненты
> devexpress по любому надо ставить :-)
если честно, то даже не пользовался никогда
Просто для топикстартера FileSystemWatcher"а хватит
← →
Тын-Дын © (2008-06-08 20:10) [33]
> VirEx © (08.06.08 17:59) [31]
> впринципе максимум 50 Мб
Простейший шаблон уже есть. Могу кинуть. Вариант рабочий, но пытливому уму всегда есть что доделывать.
← →
VirEx © (2008-06-08 21:20) [34]_ virex _ собака мэйл ру (без пробелов)
← →
Тын-Дын © (2008-06-08 21:25) [35]Подчёркивания нужны?
← →
VirEx © (2008-06-08 21:27) [36]если указываю, значит нужны
← →
Тын-Дын © (2008-06-08 21:28) [37]
> VirEx © (08.06.08 21:20) [34]
Всю обработку делай в процедуре OnFile
В примере в ней просто записывается в журнал перемещённый во временный каталог файл.procedure OnFile(FilePath: String);
begin
DirMon.AddLog(FilePath);
end;
← →
Тын-Дын © (2008-06-08 21:33) [38]Кстати, Верхне-Сысертский пруд водой заполнили?
← →
VirEx © (2008-06-08 21:37) [39]
> [37] Тын-Дын © (08.06.08 21:28)
спасибо, завтра посмотрю...
← →
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.59 MB
Время: 0.051 c