Sincronizza Indice |
Scarica il progetto |
Testo dell'articolo |
Stampa l'articolo |
In molti programmi si presenta la necessità di verificare se un dato file esiste. Infatti, in tutti i programmi dove si utilizzano files, il tentativo di leggere dati da un file inesistente genera un errore che, se non correttamente gestito, provoca la chiusura immediata del programma.
Vedremo vari esempi per verificare l'esistenza di un file specifico, ognuno con i suoi vantaggi, svantaggi e limiti. Difficoltà: 1 / 5 Probabilmente questo è il metodo più utilizzato e più
semplice.
La prima funzione si chiamerà FileEsiste1 e richiede che sia passato come parametro il nome del file da controllare. All'uscita restituisce un valore booleano: True se il file cercato esiste e False se non esiste. All'interno d'essa è dichiarata una variabile di nome strVerifica
che conterrà il valore restituito dalla funzione Dir. In questo
esempio abbiamo usato la corrispondente funzione Dir$ che restituisce
in uscita un valore di tipo String anziché di tipo Variant. Subito, alla riga 4, prepara una risposta alla ricerca del file, impostando il contenuto di FileEsiste1 a False. Questo perché il valore di risposta sarà True solo quando verrà rilevata l'esistenza del file. Alla riga 5 abbiamo il controllo vero e proprio. Se, invece, viene inviata una richiesta errata, specificando una lettera di drive dove non è presente un disco, viene generato l'errore di runtime 52 (Nome o numero di file non valido). Ma, poiché alla riga 3 abbiamo inserito un'istruzione di gestione degli errori, non ci viene presentato alcun messaggio di errore ed il codice continua il suo ciclo. Alla riga 6 abbiamo il controllo decisivo: viene innanzitutto controllato che il contenuto della variabile strVerifica non sia nullo e verifica inoltre che non sia avvenuto un errore. In ogni caso, se il valore di Err.Number è diverso da zero, la funzione FileEsiste1 restituisce il valore False, impostato alla riga 4. Questo perché il verificarsi di un errore presuppone un'errata richiesta di file. Se invece il valore di Err.Number è 0 (nessun errore), l'esistenza del file deve essere comprovata dal valore di strVerifica. Se il file non esiste il suo contenuto sarà una stringa nulla; invece se il contenuto di strVerifica fosse non nullo avremmo la quasi sicurezza che il file esiste, ed in questo caso verrebbe eseguita l'istruzione che imposta il valore di FileEsiste1 a True. Lo svantaggio principale di questa funzione di controllo è che essa non è capace di distinguere un file da un nome di drive. Se, per errore, chiedessimo se esiste il file "C:\" essa ci risponderebbe che esiste; tuttavia non potremmo mai utilizzare la radice come se fosse un file. Inoltre se nella richiesta viene inserito un carattere jolly (? oppure *), ad esempio "C:\Command.*" la funzione Dir tratterebbe tale carattere alla stessa maniera di Windows, ovvero andrebbe a cercare tutti i files il cui nome sia Command, senza badare all'estensione. Tutto ciò potrebbe sembrare corretto: esiste almeno un file con quel nome, ma che succederebbe se provassimo ad aprire il file "C:\Command.*" ? Si genererebbe un errore che bloccherebbe il programma. In definitiva il sistema di Dir è molto comodo, ma richiede che i dati inviati alla funzione siano prima trattati e controllati, al fine di evitare errori. Secondo sistema (Dir con controllo) Difficoltà: 2 / 5 Prendendo spunto dal sistema precedente, proviamo a migliorare il controllo evitando che vengano utilizzati i caratteri jolly (wildcards) nella specifica del nome del file.
La funzione FileEsiste2 è molto simile alla precedente, ma stavolta abbiamo inserito una piccola funzione di gestione degli errori. Al verificarsi di un errore il flusso del programma procede alla riga successiva.
Alla riga 6 eliminiamo gli eventuali spazi (iniziali e finali) nel nome
del file, mediante la funzione Trim.
Alla riga 10 abbiamo la solita ricerca mediante la funzione Dir.
Il valore 39 corrisponde alla combinazione delle costanti
vbArchive, vbHidden, vbReadOnly
e vbSystem allo scopo di ricercare anche tra i files nascosti
ma non le cartelle. Pertanto alla riga successiva sarà verificato se la variabile strVerifica non contenga una stringa vuota e non sia stato generato qualche errore. Solo questa condizione assicura che il risultato della funzione Dir sia coerente. Al verificarsi di queste due condizioni sarà impostato il valore di uscita della funzione su True. Questa soluzione effettua alcuni primi controlli ma ancora non provvede a riconoscere i files dalle radici dei dischi. Difficoltà: 3 / 5 Il problema principale delle funzioni viste precedentemente è che quando forniamo come parametro il percorso di una cartella contenente almeno un file, esse ci rispondono che il file esiste. Per evitare questi errori, abbandoneremo l'uso della funzione Dir ed utilizzeremo al suo posto la funzione GetAttr. Essa ci restituisce un numero intero rappresentante gli attributi del file/cartella interessato. Per individuare lo stato di un determinato attributo è necessario effettuare un'estrazione bit a bit del valore restituito da GetAttr.
Anche nella funzione FileEsiste3 eliminiamo tutti gli spazi - iniziali e finali - dal parametro FileDaControllare, per evitare possibili errori di scrittura. Vada da sé che la corretta apertura del file richiede il nome del file scritto in maniera corretta, ovvero senza gli spazi iniziali e finali.
Qui sta il centro di questa funzione. La funzione GetAttr e l'estrazione
bit a bit fungono da sistema di verifica. Poiché la riga 6 ci dà la sicurezza che il file richiesto esista, possiamo tranquillamente impostare il contenuto di FileEsiste a True e forzare l'uscita dalla funzione in caso non si siano verificati errori in precedenza. Questa funzione è ancora più precisa delle precedenti, pur essendo più semplice, ma in alcuni casi - particolarmente rari - può dare qualche problema. Difficoltà: 3 / 5 Il caso accennato sopra corrisponde ai tentativi di apertura di files che risiedono in cartelle protette, delle quali è possibile ricavare lo stato degli attributi, la presenza del file, ma non è possibile, ad esempio apportare modifiche. La funzione che vedremo questa volta tenterà di effettuare l'apertura del file in modalità lettura e scrittura. Se l'apertura del file in tali modalità andrà a buon fine avremo la sicurezza che il file esiste e che sia accessibile, sia in lettura che in scrittura, agli altri programmi. Per qualche informazione aggiuntiva sulle modalità di apertura di un file dare uno sguardo all'HowTo dedicato alla lettura di un file.
Al solito, nella prima parte della funzione inizializziamo la gestione
degli errori, eliminiamo gli spazi iniziali e finali dal nome del file
ed inizializziamo il contenuto della funzione FileEsiste4.
Alla riga 6 otteniamo il primo handle di file libero mediante la funzione FreeFile e memorizziamo tale valore all'interno della variabile FileNR.
Subito dopo questo tentiamo l'apertura del file in modalità Input
ovvero lettura.
Ed ecco che alla riga 9 se l'operazione precedente non ha generato alcun
errore, tentiamo l'apertura del file in modalità Append,
ovvero scrittura aggiuntiva al file esistente. Giunti a questa riga, sappiamo
con sicurezza che il file esiste, ed ecco perché tentiamo l'apertura
in Append: infatti il tentativo di apertura del file in modalità
Output comporterebbe l'azzeramento del file esistente.
Giunti alla riga 11 ci basterà verificare se la precedente apertura ha generato qualche errore. Nel caso non ci siano stati errori possiamo dire con sicurezza che il file esiste ed è accessibile almeno in due modalità. Impostiamo il contenuto di FileEsiste a True e possiamo uscire dalla funzione. A questo punto disegnamo una semplice interfaccia per provare le quattro funzioni: posizioniamo sopra un form una TextBoxdi nome NomeFile ed una matrice di 4 pulsanti di nome Controlla con Index da 0 a 3. Nella finestra del codice, alla routine che gestisce il click sopra uno qualunque dei pulsanti scriviamo:
Il codice è molto molto semplice: alla riga 2 viene dichiarata una variabile di tipo Boolean di nome Esiste; essa conterrà il valore restituito dalle quattro funzioni di controllo del file. Alla riga 3 viene controllato il valore di Index fornito come
parametro dall'evento Click; tale valore corrisponde alla proprietà
Index del pulsante premuto. Alla riga 10 viene controllato il valore restituito da tali funzioni: se esso è True - ovvero il file esiste, secondo il criterio adoperato dalla funzione - viene visualizzata una finestra di dialogo che informa che il file esiste. In caso contrario ne viene visualizzata una di errore. Per provare le funzioni si consiglia l'immissione di una cartella quale
"C:\" e vedere, per ognuna delle funzioni, il risultato
riportato. |
Alla fine dell'esame, la routine che può sembrare più idonea
al controllo dell'esistenza di un file è l'ultima perché
adopera le soluzioni di apertura sia in lettura che in scrittura per assicurare
l'accesso a tale file. Fibia
FBI
|
Torna all'indice degli HowTo |