Sincronizza Indice |
Scarica il progetto |
Testo dell'articolo |
Stampa l'articolo |
Quasi tutti i moderni programmi affidano alle funzioni di Shell il compito delle operazioni di copia, spostamento ed eliminazione dei files. In tal modo infatti il programmatore si scarica di alcuni compiti di analisi, in particolare la reiterazione per le sottocartelle. L'utente invece si trova a contatto con un'interfaccia grafica conosciuta ed apprezzata. Vedremo in questo progetto come richiamare le funzioni della shell per queste operazioni.
La classe clsFBIShellFileOperation sviluppata in questo progetto consentirà di eseguire le operazioni più comuni con estrema semplicità:
L'enumerazione SHOperations si compone di 4 costanti definite dall'API che specificano il tipo di operazione da svolgere tra spostamento, copia, cancellazione e rinominazione. Sarà utilizzata più avanti dalla struttura SHFILEOPSTRUCT.
L'enumerazione SHOperationFlags consente di specificare uno o più comportamenti aggiuntivi durante l'operazione di Shell. I loro nomi dovrebbero da soli essere chiari ma merita una piccola citazione il flag FOF_ALLOWUNDO (riga 18) che consente di annullare l'ultima operazione eseguita, mediante la voce Annulla del menu popup in una qualunque cartella. Funziona regolarmente per le operazioni di copia e spostamento, ma nel caso dell'operazione di cancellazione, differenzia lo spostamento nel cestino dall'eliminazione vera e propria; la specifica del flag FOF_ALLOWUNDO nell'operazione di cancellazione comporta quindi lo spostamento nel cestino dei files.
La struttura SHFILEOPSTRUCT, riportata in maniera errata dalla maggior parte delle documentazioni, è stata trattata in un articolo della sezione Weird Things, è stata corretta per consentire un corretto funzionamento della funzione in tutte le situazioni. Il campo wFunc della struttura specifica il tipo di operazione da eseguire e determina l'uso degli altri campi; ad esempio durante la copia di files il campo pFrom indicherà l'origine dei files da copiare, mentre pTo conterrà la destinazione per i files; nel caso invece della cancellazione, il campo pTo non dovrà essere specificato. I valori ammessi per il campo wFunc sono quelli contenuti nell'enumerazione SHOperations, mentre per il campo fFlags sarà necessario specificare uno o più valori dell'enumerazione SHOperationFlags.
L'intero codice è basato sull'uso della funzione SHFileOperation che richiede la specifica di una variabile di tipo SHFILEOPSTRUCT, definito in precedenza; tale valore è dichiarato alla riga 42, col nome udtOperation.
Il valore predefinito per il campo fFlags sarà FOF_NOERRORUI, che specifica di non mostrare le videate di errore della Shell, ma lasciare il compito al programma.
La proprietà AllowUndo è utilizzata per recuperare ed assegnare con semplicità il flag FOF_ALLOWUNDO accennato in precedenza e consentire l'annullamento dell'ultima operazione eseguita.
La proprietà Confirm consente di richiedere conferma all'utente prima di eseguire certe operazioni di sovrascrittura o cancellazione. Si tratta in sostanza di recuperare o assegnare il valore del flag FOF_NOCONFIRMATION.
Le tre proprietà Destination, Flags e Source consentono di recuperare o assegnare rispettivamente la destinazione (pTo), i flags (fFlags) e l'origine (pFrom) della variabile udtOperation che verrà utilizzata per eseguire l'operazione di Shell.
L'unico metodo della classe clsFBIShellFileOperation è Esegui e richiede la specifica del tipo di operazione da eseguire, corrispondente ad un valore dell'enumerazione SHOperations. Il valore sarà assegnato al membro wFunc della struttura udtOperation e quindi sarà richiamata la funzione SHFileOperation con la stessa struttura. Svilupperemo una semplice interfaccia per il nostro progetto, formata ad un controllo DirListBox di nome dirOrigine ed un controllo FileListBoxcollegato di nome filOrigine. In fondo a queste avremo tre pulsanti di nome cmdCopia, cmdSelezionaTutto e cmdDeselezionaTutto. Sul lato destro avremo invece un altro controllo FileListBox di nome filTemp che punterà sempre alla stessa cartella del programma; anche in fondo a questo esistono tre pulsanti di comando, di nome cmdAggiorna, cmdCestina e cmdElimina. Il controllo filOrigine avrà inoltre la proprietà MultiSelect impostata su 1 - Simple. Come già detto, i due controlli dirOrigine e filOrigine saranno collegati, per cui al cambio della cartella sul controllo superiore corrisponderà il cambio della cartella nel secondo. Vediamo il semplice codice che gestisce tutti gli eventi del form:
Alla riga 3 è dichiarata un'istanza della classe clsFBIShellFileOperation, che verrà dichiarata in occasione del caricamento del form.
La funzione LastBSlash, trattata anche in altri articoli del sito, è utilizzata per assicurare che il percorso fornito termini con una barra rovesciata ( \ ) e poterlo quindi concatenare ad un nome di file ed avere quindi la sicurezza che il percorso fornito sia valido. Prendiamo ad esempio il percorso C:\ da concatenare ad un nome di file quale "file1.txt"; nel caso del percorso "C:\" non sarà necessario aggiungere la barra rovesciata ("C:\" & "file1.txt"), ma nel caso di un altro percorso quale "C:\Cartella", la stessa sarà mancante e dovrà essere specificata prima del nome del file. La funzione LastBSlash restituisce sempre e comunque un percorso che termini con la barra rovesciata, da concatenare quindi al nome di un file. La funzione sarà utilizzata alla riga 12, al caricamento del form, per inizializzare il controllo filTemp e farlo puntare alla cartella TEMP contenuta nella cartella del nostro programma; in occasione dell'operazione, sarà anche istanziata la variabile fbiShellOperation, che verrà quindi deallocata alla chiusura del form.
Come già detto, al cambio della cartella nel controllo dirOrigine
corrisponderà il cambio della cartella del controllo filOrigine
e ciò è gestito alle righe 19-21.
Le due routine legate al click dei pulsanti cmdSelezionaTutto e cmdDeselezionaTutto sono molto simili e comprendono un semplice ciclo per ogni elemento dell'elenco filOrigine. La prima routine assegnerà lo stato di selezionato ad ogni elemento, mentre la seconda deselezionerà tale stato.
La prima routine che utilizza l'istanza fbiShellOperation è quella legata all'operazione di copia selezionati nell'elenco filOrigine. Sarà pertanto lanciato un ciclo per tutti gli elementi dell'elenco (riga 46) ed il nome (completo di percorso) di ciascun file selezionato sarà concatenato alla variabile strFiles. I nomi saranno tra loro separati da un carattere NULL.
Se almeno un file sarà stato accodato alla variabile strFiles, sarà quindi aggiunto un ulteriore carattere terminatore (riga 49) e quindi invocata la procedura di copia dei files selezionati. Saranno impostate le proprietà Confirm su True, AllowUndo su False, Source sull'elenco di files da copiare e Destination sul percorso della cartella temporanea (indicato dalla proprietà Path del controllo filTemp, inizializzato all'avvio del programma). Sarà quindi lanciata la procedura di copia mediante metodo Esegui. Al termine dell'operazione sarà forzato l'aggiornamento dell'elenco filTemp, richiamando la routine cmdAggiorna_Click.
Le due routine di eliminazione definitiva o provvisoria, si differenziano soltanto per l'assegnazione della proprietà AllowUndo dell'istanza fbiShellOperation. Entrambe affidano l'operazione alla routine EliminaFiles che vediamo qui di seguito:
La routine assegna come origine dei files da eliminare il percorso della cartella TEMP, concatenato con i caratteri jolly *.*; la destinazione dovrà essere nulla, sarà attivata la conferma (riga 76) e lanciata quindi l'operazione alla riga successiva. Al termine dell'operazione sarà richiesto l'aggiornamento dell'elenco filTemp mediante richiamo della routine cmdAggiorna_Click.
Durante le operazioni di copia, spostamento nel cestino ed eliminazione dei files saranno mostrate le finestre di dialogo standard in ambiente Windows, analoghe a quelle mostrate a fianco. Resta tuttavia impossibile modificare il titolo mostrato sulla barra delle suddette finestre di dialogo ed il testo in esso contenuto. Ad esempio durante l'operazione di spostamento nel cestino di uno o più files sarà mostrato il testo "Spostare i file selezionati elementi nel Cestino?", mentre nel caso di eliminazione diretta apparirà il testo "Eliminare tutti gli elementi presenti nel Cestino?", entrambi per nulla chiari, anzi fuorvianti con le azioni da svolgere.
|
La classe clsFBIShellFileOperation consente una minima gestione delle operazioni sui files con estrema semplicità e dovrebbe essere preferita alla copia manuale di uno o più files, in modo da rendere l'ambiente in cui si opera quanto più familiare possibile con il look dei vari Windows in cui il programma viene eseguito. Fibia
FBI
|
Torna all'indice degli HowTo |