Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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 //&#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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.59 MB
Время: 0.038 c
15-1214563536
oldman
2008-06-27 14:45
2008.08.17
Архиватор PAR


15-1214795612
Slider007
2008-06-30 07:13
2008.08.17
С днем рождения ! 30 июня 2008 понедельник


3-1203685287
TFieldDefs
2008-02-22 16:01
2008.08.17
AddFieldDef - бага в DB.pas


2-1215500811
matriza
2008-07-08 11:06
2008.08.17
Excel. Узнать координату ячейки


3-1204174838
Ega23
2008-02-28 08:00
2008.08.17
Реализация Full Text Search в MSSQL





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский