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

Вниз

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 //&#239;&#243;&#241;&#242;&#243;&#254; &#239;&#224;&#239;&#234;&#243; &#243;&#228;&#224;&#235;&#232;&#235;&#232;, &#226;&#251;&#240;&#243;&#225;&#224;&#229;&#236;&#241;&#232;
         (CompletionKey = 0) //&#242;&#243;&#242; &#226;&#238;&#225;&#249;&#229; &#230;&#243;&#242;&#252; &#242;&#226;&#238;&#240;&#232;&#242;&#241;&#255;
         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.61 MB
Время: 0.02 c
2-1215788028
GrieVeR-13
2008-07-11 18:53
2008.08.17
Событие OnTimer


15-1211457036
Kerk
2008-05-22 15:50
2008.08.17
Идеальная потрепаловка. Какой она должна быть?


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


15-1214636002
Kolan
2008-06-28 10:53
2008.08.17
Все отстрелялся, теперь я учёный! :)


2-1216068588
DJ_UZer
2008-07-15 00:49
2008.08.17
как програмно нажать на клавиши