PDA

View Full Version : [VB]Capire se un file è aperto da un'applicazione


leon84
21-06-2005, 15:19
Salve a tutti,
ho il seguente problema ....
Ho realizzato un'applicazione che appena si accorge della presenza di un file su di una directory specifica comincia ad utilizzarlo per le sue elaborazioni ...

Il punto è che se lo copio manualmente in questa directory tutto funziona bene ma se lo uplodo nella stessa directory utilizzando un ftp le cose non vanno bene .... Questo perché l'applicazione accorgendosi del file comincia a processarlo prima ancora che la sessione ftp abbia finito di scaricarlo completamente ....
Le soluzioni potrebbero essere due : o applico un ritardo nel processare il file dal momento che comincia la scrittura oppure molto più elegantemente potrei verificare magari con qualche API se il file è aperto in scrittura da qualche altro processo ....

Conoscete qualche API a riguardo ?

leon84
22-06-2005, 09:26
UP

kk3z
22-06-2005, 15:16
Normalmente, usando CreateFile(...) su un file già aperto da un'altra applicazione GetLastError() ritorna ERROR_SHARING_VIOLATION che su msnd significa

The process cannot access the file because it is being used by another process.

altrimenti, metodo abbastanza più brutto, crei un timer e controlli la dimensione del file, se aumenta a ogni chiamata del timer aspetta :sofico:

71104
22-06-2005, 16:37
Normalmente, usando CreateFile(...) su un file già aperto da un'altra applicazione GetLastError() ritorna ERROR_SHARING_VIOLATION che su msnd significa [...] questo accade solamente se l'altro processo ha aperto il file senza nessun flag FILE_SHARE_XXX.
il tuo problema (capire se un file è aperto da un altro processo) è molto comune e credo che una soluzione vera e propria in Win32 non ci sia (se ci fosse sarebbe di sicuro qualcosa di poco elegante), perciò devi risolvere in altra maniera, ad esempio processando il file solo quando la sua dimensione raggiunge il valore che dovrebbe avere (che puoi cercare di conoscere in qualche modo), oppure vedendo se il tuo client FTP ha qualche impostazione x cui i files incompleti stanno in una certa dir e vengono spostati in 1 altra quando vengono completati.

leon84
09-07-2005, 01:01
questo accade solamente se l'altro processo ha aperto il file senza nessun flag FILE_SHARE_XXX.
il tuo problema (capire se un file è aperto da un altro processo) è molto comune e credo che una soluzione vera e propria in Win32 non ci sia (se ci fosse sarebbe di sicuro qualcosa di poco elegante), perciò devi risolvere in altra maniera, ad esempio processando il file solo quando la sua dimensione raggiunge il valore che dovrebbe avere (che puoi cercare di conoscere in qualche modo), oppure vedendo se il tuo client FTP ha qualche impostazione x cui i files incompleti stanno in una certa dir e vengono spostati in 1 altra quando vengono completati.

Il punto è che la mia applicazione gira su una macchina che è un server ftp e non un client .... In ogni caso volendo fare col timer che api uso per conoscere la dimensione del file ????