FIle System Watcher

giovedì 08 aprile 2004 - 09.53

zangief77 Profilo | Newbie

Salve,

ho realizzato un progetto di monitor folder, ovvero ho una applicazione che
mi monitorizza una cartella, quando nella cartella viene copiato un file
l'applicazione scatena degli eventi.

Il problema è che se faccio un handle all'evento Created quando il file
copiato è lungo gli eventi vengono scatenati prima che la copia sia
terminata, generando così errori nei passaggi successivi. Ho notato però che
se faccio l'handle all'evento Change questo evento viene generato 3 volte
prima che il file sia arrivato (un po' come mi rinnegherai tre volte prima
che il gallo canti!! visto che siamo in odore di pasqua!! :-) ) quindi in
OnChange inizializzo un contatore ed aspetto di aver contato fino a tre
prima di scatenare gli eventi. Mi rendo conto però che questo è un sistema
un po' troppo fittizio, infatti talvolta ho problemi se due file vengono
copiati in contemporanea o se faccio un trascinamento del file.

Come posso fare a trappare l'evento Created aspettando però la fine del file
prima di scatenare gli eventi?

Grazie

Gianni

Brainkiller Profilo | Guru

Ciao gianni,
è un interessante problema il tuo. Non hai per caso del codice da allegare in modo che provo a fare dei test anche io in modo da non dovermi riscrivere tutto per creare l'ambiente di test, perchè sono curioso anche io.

ciao
david

zangief77 Profilo | Newbie

Ok ti allego un progetto molto semplice ma utile a chiarire ciò di cui parlavo. Il progetto monitorizza una cartella che viene creata sul desktop di nome Monitor. Ti spiego cosa succede e quali sono i problemi. come vedi gestisco sia l'evento onchange che quello oncreated, ma ne utilizzo uno per volta commentando l'altro. Se trappo l'oncreated in qualsiasi modo venga inserito il file nella cartella (trascinandolo o copia incolla) viene riconosciuto l'evento ed infatti il nome del file compare nella txtbox. In questo caso però il mio problema è che la mia monitor folder monitorizza eventuali video che arrivano nella cartella per far partire un processo di analisi e codifica. Quindi visto che l'evento vieno trappato appena il file arriva nella cartella e non quando è completamente copiato, la ia analisi inizia su un file incompleto generando quindi errori. Mi sono accorto quindi che se gestisco l'evento oncreated questo viene generato tre volte prima che il file sia completamente arrivato. Quindi con un semplice contatore pensavo di aver risolto il problema. Non è così perchè in questo caso il progetto risulata insensible ai trascinamenti di file che già staveno nella cartella. Ad esempio prendo un file di prova lo copio nella monitorfold, tutto ok, risposto il file sul desktop e lo trascino nuovamente nella monitorfold, il file a questo punto non viene riconosciuto. Oltretutto con questo metodo ho dei problemi se copio più file per volta.
Quindi io vorrei riconoscere immediatamente quando un file viene copiato nella monfold ma aspettare che sia completamente copiato prima di scatenare degli eventi. Sperando di essere stato chiaro ti ringrazio in anticipo per l'interesse.

Ciao

Giani

Brainkiller Profilo | Guru

Ciao Gianni,
mi spiace dirti che il tuo codice funziona perfettamente !
E quindi il problema è forse altrove. Ho provato a copiare nella cartella monitor file di varie dimensioni e l'evento si scatena solo (sul mio PC) al termine della copia del file.
Ho provato anche con un file di 120 mega. Mentre Windows visualizza il trasferimento in corso nella textbox non si vede niente, quando è terminato il trasferimento e scompare la finestrella di Windows automaticamente compare il nome del file dentro la textbox.
Questo mi sembra è quello che vuoi tu, a me funziona alla perfezione.

E il problema dove sarà ? Hai avuto modo di testarlo su altri PC ?

ciao
david

zangief77 Profilo | Newbie

Scusa, probabilmente il mio msg fiume non era tanto chiaro, se apri il codice vedi che c'è sia la funzione OnChange che OnCreate, ma nella OnCreate il codice è commentato. La OnChange funziona con il contatore dei tre eventi e funziona piuttosto bene, il problema con qesto metodo si verifica se nella cartella trascini un file che era già presente, se vuoi puoi fare questo tentativo, metti un file nella cartella, avvia il programma, trascina il file dalla cartella al desktop e poi ritrascinalo nella cartella. Tal volta l'evento non viene trappato. Se invece commenti il codice nella OnChange e riattivi quello nella OnCreate vedrai che gli eventi vengono scatenati appena il file arriva nella cartella. Scusa se vado a cercare ilpelo nell'uovo, ma il progetto mi serve per la tesi e vorrei evitare che in sede di presentazione qualcosa andasse storto! Comunque ho ovviato al problema, gestendo l'evento OnCreate ma facendo un controllo IsInUse del file prima di far partire l'analisi. Quindi il file viene segnato come arrivato anche se non è stato copiato in toto, ma l'analisi,non aveno accesso esclusivo al file, non parte finchè la copia non è terminata.

Grazie per la pazienza ed il tempo che mi hai dedicato

Saluti

Gianni
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5