[ CallMeSaMaster @ 03.09.2010. 09:19 ] @
Pozdrav,

napravio sam FileWatcher koji mi na odredjenoj lokaciji(Folderu) prati desavanja. Interesuju me samo eventi tipa Created, znaci samo kad se file kreira. Napominje m da taj folder moze imati N-subfolder-a, sto u sustini nije ni bitno, ali reda radi napominjem. Sada imam malo specificnu situaciju.

Naime kada se neki file kreira, u bazu se zapisu neki podaci vezani za sam file, tipa: Datum kreiranja, Path, etc. Znaci nista posebno. File se ne move-a nigdje nego ostaje na istoj lokaciji(U nekom od foldera ili podfoldera). Problem je u tome da kad ja zaustavim watcher, i kreiram jos recimo 10ak file-ova, FileWatcher ih ne moze registrovati(logicno). Eh sada bih htio, kada pokrenem ponovo watcher, da se recimo pokrene neka procedura koja ce pokupiti sve filove koji su stigli u medjuvremenu dok je Watcher bio ugasen. Znaci situacija je specificna, tj scenario je ovakav kakav sam opisao.

Interesuje me kako da provjerim filove koji su dosli u medjuvremenu, sobzirom da mi i stari ostaju tu gdje su pa ne mogu da razlikujem novo od starog.

Svaka pomoc je dobrodosla...
[ deerbeer @ 03.09.2010. 09:34 ] @
PA problem ti se svodi na poredjenju 2 liste fajlova kreiranih :
1.) kada je FileWatcher bio aktivan
2.) kada je FileWatcher bio neaktivan prostim izlistavanjem fajlova u folderu i podfolderima .

Za svaki folder / pod folder ispitujes naziv fajla, timestamp i proveravas da li ga ima u onoj prvoj listi .

Mozda je najbolje cak i da upises vreme zaustavljanja FileWatchera , pa da posle poredis samo datume pristiglih fajlova
u tom direktorijumu kada se sledeci put pokrene FW


[ lukeguy @ 03.09.2010. 09:36 ] @
Ako već pamtiš putanju svakog fajla, onda možeš da proveriš za svaki fajl da li postoji u bazi.

Drugo što mi pada na pamet je da napraviš neki hash za svaki folder, pa i to da čuvaš u bazi. Onda ne moraš proveravati fajl po fajl, već samo fajlove u onim folderima gde je hash različit od onog koji je u bazi.

Vidi i Microsoft Sync Framework, možda ti on može biti od koristi.
[ CallMeSaMaster @ 03.09.2010. 10:03 ] @
Citat:

Mozda je najbolje cak i da upises vreme zaustavljanja FileWatchera , pa da posle poredis samo datume pristiglih fajlova
u tom direktorijumu kada se sledeci put pokrene FW


Ovo mozda i nije losa ideja, pitanje samo gdje bih cuvao taj podatak/file? S obzirom da ga svako moze obrisati, da ga neko moze izmijeniti, virusi, etc...

@lukeguy

Nije mi bas ovo najoptimalnije rijesenje, s obzirom da moram x-puta citati bazu. Radi se o ogromnom broju podataka. Recimo, da bi u bazu trebalo svaki dan da se upise ca. 500.000 slogova.
[ deerbeer @ 03.09.2010. 10:06 ] @
Citat:

Ovo mozda i nije losa ideja, pitanje samo gdje bih cuvao taj podatak?

Baza ? Opciono mozes i u registry
[ CallMeSaMaster @ 03.09.2010. 10:13 ] @
Pokusavam izbjeci citanja iz baze, bar do onog trenutka dok ne budu nuzna da nemam kuda dalje. Ali ocigledno taj trenutak nastupa vec ovdje, sobzirom da registry/file na disku ne dolaze u obzir. Razlog je jednostavana, svaka nova instalcija sistema/havarija/nehoticno brisanje/etc dovodi do gubitka podataka.
[ mmix @ 03.09.2010. 10:28 ] @
Idealno resenje nekako zavisi od kolicine podataka. Kazes 500.000? Jel to svaki dan dodajes po 500.000 novih? Ili imas 500.000 ukupno svaki dan (i starih i novih)?
[ CallMeSaMaster @ 03.09.2010. 13:38 ] @
Svaki dan dodje po 500.000. Recimo ovako da ne pricmao u prazno:

Imam 450.000 Klijenata(ca.) Svaki dan od svakog klijenta dobijem po jedan file u kojem se recimo nalazi narudzba. Svaki klijent 100% posalje po jedan zahtijev dnevno...

U bazu se naravno zapisuju smao osnovni podaci o fileu, a kasnije ih neko obradjuje(nije bitno na koji nacin.)
Nadam se da sam uspio objasniti
[ deerbeer @ 03.09.2010. 14:33 ] @
Ne verujem bas da ce jedan "select stoptime from neka_tabela " potrositi mnogo sistemskih resursa ,
osim ako se radi o vremenskom intervalu izmedju start i stop FW-a reda 10 ms sto je besmisleno :)

Zato sam i napomenuo da ti je ovo najbolje resenje , jer neces imati u petlji bespotrebnih komparacija fajlova koji ce usporavati ceo proces ,
vec samo listanje fajlova sa datumom vecim od stoptime-a .
[ CallMeSaMaster @ 03.09.2010. 15:18 ] @
Citat:

Ne verujem bas da ce jedan "select stoptime from neka_tabela " potrositi mnogo sistemskih resursa ,
osim ako se radi o vremenskom intervalu izmedju start i stop FW-a reda 10 ms sto je besmisleno :)

Zato sam i napomenuo da ti je ovo najbolje resenje , jer neces imati u petlji bespotrebnih komparacija fajlova koji ce usporavati ceo proces ,
vec samo listanje fajlova sa datumom vecim od stoptime-a .


Ja sam i rekoa u jednom dijelu da ocigledno nemam drugog izbora. Nemoj me pogresno shvatiti, samo sam htio cuti jos misljenja :D
[ mmix @ 03.09.2010. 15:25 ] @
Pazi samo na concurrency dok ti ceprkas koji su sve novi fajlovi dosli moze da dodje jos novih, tako da prvo moras da upalis filewatcher, a onda moras da pazis da ne uneses dupli unos za fajlove koji su stigli naokon sto si poceo sweep (jednom kroz filewatcher drugi put kroz sweep kad stigne do njega)
[ CallMeSaMaster @ 03.09.2010. 15:31 ] @
Citat:

Pazi samo na concurrency dok ti ceprkas koji su sve novi fajlovi dosli moze da dodje jos novih, tako da prvo moras da upalis filewatcher, a onda moras da pazis da ne uneses dupli unos za fajlove koji su stigli naokon sto si poceo sweep (jednom kroz filewatcher drugi put kroz sweep kad stigne do njega)


To i ejst moja najveca briga! Vec ludim od mogucih ludih scenarija
[ mmix @ 03.09.2010. 15:57 ] @
Pa moze to da se resi, drzis jednu sync listu i kontrolises joj pristup kroz lock, pa ko pre devojci njemu devojka. Pitanje moje je medjutim sta ce ti sve to? Zasto je neophodno da ovaj sistem bude realtime? AKo ovaj softver vec generise workload za obradu taj proces (obrada) mora imati neki tempo i porpusnu moc, na osnvu nje odredis refresh period i uradis sweep bez ikakvog filewatchera. Onda postoje i neki mehaznimi da se to ubrza malo
[ Mihajlo Cvetanović @ 03.09.2010. 16:07 ] @
Možda je jednostavnije da se fajlovi obrađuju dok ih ima, i tek kad ih obradiš i nema ih više da se uključi FileWatcher. Ako tokom obrade jedng fajla dođe novi fajl onda će i novi doći na red, jer se fajlovi obrađuju dok ih ima.
[ mmix @ 03.09.2010. 16:12 ] @
Ima folder strukturu, ako radi sweep prolazi lokacije, ako je filewatcher ukljucen na kraju a tokom sweepa dodje fajl u lokaciju koja je vec pregledana taj fajl ce biti ignorisan do sledeceg punog sweepa.
[ Mihajlo Cvetanović @ 03.09.2010. 16:30 ] @
Okej, završi glavni sweep, uključi file watcher, i uradi "za svaki slučaj" sweep. Ako je bilo fajlova u novom sweepu onda ponoviti drugu i treću tačku. Ako nije bilo fajlova onda od tog trenutka radimo sa file watcherom. Ovo je samo rešenje da se izbegne sinhronizacija, a naravno može da se reši i sa njom.
[ CallMeSaMaster @ 03.09.2010. 22:55 ] @
Znas kako je to kad imas iznad sebe ljude "koji uvijek bolje znaju". Naime moja zamisao koja perfektno radi je da napravis jedan obicni Batch task, koji svakih recimo 5 sek kupi fajlove koji su pristigli i jednostavno ih upisuje u bazu. Nakon upisa prekopira file na neku lokaciju iz koje se vrsi obrada pristiglih dokumenata. "Problem je taj" sto se ne svidja ideja da task radi stalno - po meni je to isti real time kao i FileSystem watcher ili grijesim? - Mozda cak i bolji jer me ne interesuje kad je ko stigao - jednostavno ako nesto ima u folderima, pokupi to, upisi i proslijedi dalje. Gotova prica...
[ Boris B. @ 09.09.2010. 16:01 ] @
Koristi samo Archive bit pri fajlovima, ne treba ti nikakva baza ili sl.

Vodi racuna sa kad fajl prvi put udje u folder ima Archive bit postavljen, to uradi u aplikaciji koja puni folder sa novim fajlovima. Kad udje fajl u folder imace Archive bit postavljen, tvoj filesystemwatcher onda sve sto obradi/iskopira i istovremeno postavlja Archive bit. Kad ponovo pokrenes watcher onda novi, neobradjeni fajlovi nece imati archive bit.