Newsgroup: it.comp.java
Titolo: File Polling

Salve,
Dovrei realizzare un Filepoller dato un nome di file. Apparentemente la 
questione è banale: basta creare un thread che ogni TOT secondi và a 
verificare se il metodo exists() della classe File restituisce true.
In questo modo:
if (new File("pippo.txt")).exists() [...]
Il problema reale però è che la notifica del file presente deve essere 
inviata solo se il file è completo. Nel senso che se una persona stà 
copiando il file (e il file è di notevole dimensioni),il metodo exists() 
mi restituirà true e quindi verrà scatenata tutta la catena di 
operazioni su quel file nonostante il file non sia stato ancora finito 
di copiare.
Ho provato ad usare la classe FileLock ma senza risultato.
Qualcuno ha qualche suggerimento?
Grazie mille.

Jack ha scritto:

Se non hai particolari latenze di rete sull'operazione di copia (ad es. 
il file arriva da un altro server interno, potresti usare un thread come 
hai già scritto e continuare il polling fin quando exists() == true && 
.size() == lastSize
Quindi:
- al primo exists() ti salvi la dimensione
- l'iterazione successiva verifichi se size() == dimensione precedente
- Se SI -> hai finito
- Se NO -> imposti dimensioneAttuale = size() e fai uno sleep(xxx) con 
un xxx sufficientemente alto da consentire l'arrivo CERTO di nuovi bytes
Ciao,
Tommaso

io ho utilizzato un sistema proprio di questo tipo...
per essere sicuro che il file sia completo aspetto che si "stabilizzi" la 
dimensione del file...


 di copiare.
state guardando il problema dalla parte sbagliata e se non cambiate 
punto di vista non ne uscirete mai.
il problema non è di chi fa il polling, ma di chi copia il file. è lui 
che deve notificare con una operazione atomica (esempio, rinominando il 
file) la fine dell'operazione di copia. è lui che lo sa quando ha 
finito, mica chi fa il polling.
in questo momento ti poni il problema di non prelevare il file durante 
la copia, ma hai pensato all'ipotesi che la copia per un qualche motivo 
si interrompa? anche in quel caso prelevi un file parziale.
-- 
 Fino all'anno scorso avevo un solo difetto. Ero presuntuoso.
http://softvalley.blogspot.com
http://www.flickr.com/photos/marko_po/

 
Ovviamente, se ha il controllo del processo di copia, hai ragione...
Per fare una analisi corretta si dovrebbe sapere cosa si deve 
realizzare, ma dalla domanda posta non mi pare sia questo il caso in 
quanto parla di PERSONE che fanno l'operazione di copia e difficilmente 
gli utenti sono affidabili (a mio parere, se l'operazione è manuale, 
avrai problemi in ogni caso)...
Ciao,
Tommaso

di copiare.
Il thread che sta copiando il file deve acquisire un lock(monitor o
cmq usare altre strutture di sincronizzazione) su questo file, e
bloccare l'accesso a tutti gli altri mentre lo fa, cosi come pure
quando si stanno eseguendo delle operazioni sul file si deve acquisre
un lock e impedire un eventuale copia.

 Ovviamente, se ha il controllo del processo di copia, hai ragione...
ho ragione comunque :-)
purtroppo se il processo che copia (umano o software) non "collabora" la 
soluzione non c'è. le soluzioni proposte confidano sulla probabilità e 
non sulla certezza, cioè che quasi sempre va bene, ma purtroppo in 
informatica quel "quasi" è determinante. specialmente in un processo 
come quello che non è presidiato.
se non ha il controllo deve farlo presente a chi ha il controllo, perchè 
il giorno che passerà un file corrotto andranno a cercare lui...


 il giorno che passerà un file corrotto andranno a cercare lui...
Ha ragione "rootkit".
Fornire un programma che stocasticamente funziona il 99% delle volte è 
sempre un rischio.
La volta in cui non funziona capiterà e creera un problema, se il 
committente è fortunato il problema sarà palese e ti chiederanno 
comunque di risolvere quello che non hai voluto/potuto risolvere adesso.
Se il committente non è fortunato il problema non sarà palese e nella 
banca dati del ci saranno dei dati corrotti prodotti dal tuo software 
senza che lui lo sappia. Eventualmente questi dati potrebbero essere 
usati da altri software che creano altri dati corrotti perché partono da 
dati corrotti.
Meglio fare presente subito che non è tecnicamente possibile creare una 
soluzione che soddisfi i requisiti e che è meglio rivedere il processo 
entro il quale il tuo software si inserisce. Per esempio aggiungendo la 
benedetta notifica di download completato alla procedura o processo che 
fa il download.
--
Andrea Francia

Andrea Francia ha scritto:

Ripeto, in linea teorica avete ragione...
Ripeto anche: "Per fare una analisi corretta si dovrebbe sapere cosa si 
deve realizzare"
A me è capitato concretamente un problema simile (copia da parte di enne 
utenti "persone" di files su di un server che devono poi essere 
processati) e l'approccio iniziale è stato proprio quello che sostenete 
voi... peccato che dopo un mese ci si è accorti che gli utenti si 
dimenticavano di rinominare i files e che quindi i dati raccolti erano 
sbagliati. Il software funzionava benissimo, ma il risultato non era 
proprio quello desiderato.
Adesso usano l'approccio descritto da me e, finora (dopo un anno), non 
ci sono stati problemi... però ripeto dipende sempre da enne 
combinazioni (dimensione dei files, livello di concorrenza dei files, 
l'operazione è obbligatoriamente manuale o può essere fatt da un sw, 
ecc.) e quindi prima di tutto bisogna sapere "cosa si deve realizzare"
Caio,
Tommaso

 
Tutto vero. Ma il barbatrucco del rename dovrebbe funzionare lo stesso 
anche se lo fai tu, nel tuo poller thread: se ci riesci significa che il 
file è completo, altrimenti (se la copia è ancora in corso) l'operazione 
fallisce e ci riprovi al prossimo giro. Il locking in questo caso lo 
gestisce il sistema operativo.
 >> ...hai pensato all'ipotesi che la copia per un qualche
 >> motivo si interrompa? anche in quel caso prelevi un file parziale.
 >>
Giusto anche questo, mi aspetto pero' che il contenuto sarà in qualche 
modo validato. O no?
Ciao,
     Bruno
P.S.
Occhio ai meeting del JUG Torino!
http://www.jugtorino.it/meeting
-- 
| Bruno Bossola
| A Java Software Engineer :-)
| 
http://www.jugtorino.it/bbossola
| Coordinatore del JUG Torino - 
http://www.jugtorino.it

 | Coordinatore del JUG Torino -
http://www.jugtorino.it
rootkit ha ragione, una soluzione potrebbe essere quella di aggiungere
alla fine del file un simbolo che ne indica la fine. Il tuo programma
verificherà che:
if(il file esiste && EOF=="tokenfinefile")
       ok il file c'è
else
       altrimenti
dati file
.....
tokenfinefile

 rootkit ha ragione...
 >
Chi dice il contrario?
 > una soluzione potrebbe essere quella di aggiungere
 > alla fine del file un simbolo che ne indica la fine....
 >
Mi sembra un po' troppo debole come controllo. Meglio sarebbe poter 
fare, come dicevo, un controllo a livello applicativo: che so, se si 
tratta di un file XML ad esempio questo puo' essere facilmente 
verificato, se si tratta di un file binario di un qualche tool anche 
(i.e. un file excel?) se invece si tratta di un file misterioso con 
contenuti sconosciuti, beh no :) E dal momento che la copia, come visto, 
la esegue una persona quest'ultima difficilmente si ricorderebbe di 
aggiungere un marker in fondo al file.
Se il controllo applicativo non puo' essere fatto allora sposo 
completamente la tesi iniziale: č necessario fornire all'utente un 
micro-client per effettuare il trasferimento del file: a quel punto ci 
ficchi tutti i controlli che vuoi :)
Ciao,
     Bruno
P.S.
Cerca di quotare meglio il testo:
http://it.geocities.com/usenetitalia/quoting.html


 tokenfinefile
In realtà credo che Bruno pensasse di più ad un hash (es. MD5) del file. 
Quindi fare l'upload di due file, il secondo contenente l'hash del 
primo. Questo secondo file potrebbe svolgere il duplice scopo di 
"segnalatore" del termine dell'upload (non definitivo, per quanto detto 
precedentemente nel thread), e di dare la possibilità di controllare che 
l'upload del primo file è avvenuto correttamente e completamente.
Ciao
   Lucio
-- 
Lucio Benfante
JUG Padova           
http://www.parancoe.org
 ...have a look at it!
www.jugpadova.it
 
http://www.jugevents.org

 JUG Padova          
http://www.parancoe.org.
..have a look at it!
www.jugpadova.it
 
http://www.jugevents.org
ci sarebbe da precisare che come l'utente potrebbe dimenticare il
marker alla fine del file allo stesso modo potrebbe dimenticare di
fare l'upload del secondo file
quindi ci risiamo!

 quindi ci risiamo!
...piano...e chi stava parlando di utenti? Io stavo parlando di 
software...se la cosa è solamente in mano all'utente, l'affidabilità 
scende a quella dell'utente...cioè praticamente a zero.
In ogni caso, il monitorare l'upload del file mi sembra naif. Non c'è 
modo che funzioni...ci vuole un segnale che l'upload sia terminato...e 
per fare le cose bene, anche un modo per verificare che sia terminato 
correttamente. Quindi io rivedrei un po' le specifiche (a meno che, 
avere un software che può non funzionare non sia un problema).
-- 
Lucio Benfante


 E dal momento che la copia, come visto, la esegue una persona quest'ultima difficilmente si ricorderebbe di aggiungere un marker in fondo al file.
io avevo capito che la copia la facesse l'utente

reco...@gmail.com
 ha scritto:

Sì...ma la farà usando un qualche software, no?


 JUG Padova          
http://www.parancoe.org.
..have a look at it!
www.jugpadova.it
 
http://www.jugevents.org
penso proprio di no altrimenti il marker lo si farebbe aggiungere al
software stesso e non all'utente