Estrarre Extended Properties da un File con Visual Basic 6
Transcript
Estrarre Extended Properties da un File con Visual Basic 6
Estrarre Extended Properties da un File con Visual Basic 6 Scritto da TheTruster Giovedì 10 Luglio 2008 10:10 Mi piacerebbe condividere con voi una funzione che ho realizzato per rispondere ad una richiesta posta nella Sezione Visual Basic 6 su MasterDrive.it. La richiesta puntava a conoscere una metodologia per rilevare, da un qualsiasi file, in linguaggio VB6, le informazioni contenute nel riepilogo di Esplora Risorse di Windows, ovvero i cosiddetti Metadata o Extended File Properties. In realtà per ottenere le classiche informazioni come Data Ultimo Accesso, Ultima Modifica e Dimensione, esiste l'efficiente e performante API GetFileInformationByHandle oppure il FileSyestemObject, ma la metodologia che sto per descrivere permette di avere indietro molte più informazioni come Proprietario, Autore, Titolo oppure Artista, Titolo album, Anno, Numero brano, Genere, Durata, etc. per i file audio, o ancora Modello fotocamera, Data immagine scattata, Formato per le foto, e molte altre informazioni. Ci si avvarrà di un oggetto Shell creato via codice, utile per stabilire un "contatto" con il sistema, facendoci restituire tutte le proprietà che è possibile riscontrare in un qualsiasi file presente nel nostro sistema. Per comodità ho preferito incapsulare il codice necessario al reperimento delle informazioni in una Function in modo che sia possibile dichiararla in un qualsiasi modulo .bas sfruttandone le potenzialità da qualsiasi punto del codice. Utilizzeremo 3 variabili oggetto "chiave" atte a contenere i riferimenti agli oggetti necessari: Shell, Folder e Item. Servirà, inoltre, un Array per conenere i nomi delle Proprietà che ci interessa ottenere dal File. In realtà non sarebbe necessario, visto che le proprietà (circa 40) sono indicizzabili numericamente, ma considerato che la Function che realizzeremo restituirà una Collection, è opportuno inserire come chiave di ognuna delle proprietà il corrispondente testuale, per richiamarle con maggiore naturalezza all'interno del codice. Ovviamente questo discorso andrebbe a cadere nel caso in cui il nostro programma dovesse girare su un sistema non italiano, poichè la descrizione di queste proprietà è strettamente legata alla lingua del sistema. In questo caso, converrebbe affidarsi esclusivamente all'indice numerico. Il principio di funzionamento è il seguente: vengono dichiarati gli oggetti Shell, Folder e Item, l'array dei nomi delle proprietà e la Collection {geshi xml:lang="vb"}Dim oShell As Object Dim oFolder As Object Dim oItem As Object Dim arrProps(41) Dim tmpCol As New Collection{/geshi} A questo punto assegnamo gli oggetti, creando l'oggetto shell e assegnando l'oggetto folder attraverso di esso: 1/5 Estrarre Extended Properties da un File con Visual Basic 6 Scritto da TheTruster Giovedì 10 Luglio 2008 10:10 {geshi xml:lang="vb"}Set oShell = CreateObject("Shell.Application") Set oFolder = oShell.NameSpace(sPath & ""){/geshi} sPath è una delle variabili che la funzione prenderà in ingresso. Popoliamo l'array delle proprietà ciclando, attraverso un indice, le proprietà disponibili: {geshi xml:lang="vb"}For i = 0 To 40 arrProps(i) = oFolder.GetDetailsOf(oFolder.Items, i) Next{/geshi} Questo è il momento in cui possiamo popolare la Collection con i valori delle proprietà precedentemente immagazzinate nell'array, utilizzando un ciclo For Each oItem selezionando solo il nome del File che ci interessa e che avremo passato alla Function attraverso il parametro sFilename {geshi xml:lang="vb"}For Each oItem In oFolder.Items If LCase(oItem.Name) = LCase(sFileName) Then For i = 0 To 40 If arrProps(i) <> "" Then tmpCol.Add oFolder.GetDetailsOf(oItem, i), arrProps(i) End If Next Exit For End If Next{/geshi} Assegnamo la collection popolata risultante alla Funcion per restituirla al codice chiamante {geshi xml:lang="vb"}Set FileProperties = tmpCol{/geshi} e annulliamo tutti gli oggetti utilizzati per restituire le risorse al sistema {geshi xml:lang="vb"}Set tmpCol = Nothing Set oFolder = Nothing Set oShell = Nothing{/geshi} Questa è la Function completa: {geshi xml:lang="vb"}Public Function FileProperties(sPath As String, sFileName As String) As Collection Dim oShell As Object Dim oFolder As Object Dim oItem As Object Dim arrProps(41) Dim tmpCol As New Collection Set oShell = CreateObject("Shell.Application") 2/5 Estrarre Extended Properties da un File con Visual Basic 6 Scritto da TheTruster Giovedì 10 Luglio 2008 10:10 Set oFolder = oShell.NameSpace(sPath & "") For i = 0 To 40 arrProps(i) = oFolder.GetDetailsOf(oFolder.Items, i) Next For Each oItem In oFolder.Items If LCase(oItem.Name) = LCase(sFileName) Then For i = 0 To 40 If arrProps(i) <> "" Then tmpCol.Add oFolder.GetDetailsOf(oItem, i), arrProps(i) End If Next Exit For End If Next Set FileProperties = tmpCol Set tmpCol = Nothing Set oFolder = Nothing Set oShell = Nothing End Function{/geshi} Si potrà utilizzare la function in qualsiasi punto del codice con una semplice riga, ma facendo attenzione al fatto che servirà una Collection di appoggio per ricevere il risultato: {geshi xml:lang="vb"}Dim clProps As Collection Set clProps = FileProperties("C:TuaCartellaTuaSottoCartella", "TuoFile.xyz"){/geshi} Una volta ottenuta la collection è possibile "interrogarla" con la chiave relativa alla proprietà da analizzare: {geshi xml:lang="vb"}Debug.Print clProps("Autore") Debug.Print clProps("Data Creazione"){/geshi} oppure, ancora meglio, per evitare problemi con i sistemi in lingua differente, con un indice numerico: {geshi xml:lang="vb"}Debug.Print clProps(7) Debug.Print clProps(15){/geshi} In un sistema Italiano, l'elenco delle chiavi delle proprietà ottenibili è questo: {geshi xml:lang="vb"}Nome Dimensione Tipo Data ultima modifica Data creazione Data ultimo accesso Attributi Stato 3/5 Estrarre Extended Properties da un File con Visual Basic 6 Scritto da TheTruster Giovedì 10 Luglio 2008 10:10 Proprietario Autore Titolo Oggetto Categoria Pagine Commenti Copyright Artista Titolo album Anno Numero brano Genere Durata Velocità in bit Protetto Modello fotocamera Data immagine scattata Formato Titolo puntata Descrizione programma Dimensioni campione audio Velocità campione audio Canali Società Descrizione Versione file Nome prodotto Versione del prodotto Parole chiave{/geshi} 1. Public Function FileProperties(sPath As String, sFileName As String) As Collection 2. Dim oShell As Object 3. Dim oFolder As Object 4. Dim oItem As Object 5. Dim arrProps(41) 6. Dim tmpCol As New Collection 7. Set oShell = CreateObject("Shell.Application") 8. Set oFolder = oShell.NameSpace(sPath &amp; "") 9. For i = 0 To 40 10. arrProps(i) = oFolder.GetDetailsOf(oFolder.Items, i) 11. Next 12. For Each oItem In oFolder.Items 13. If LCase(oItem.Name) = LCase(sFileName) Then 14. For i = 0 To 40 4/5 Estrarre Extended Properties da un File con Visual Basic 6 Scritto da TheTruster Giovedì 10 Luglio 2008 10:10 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. If arrProps(i) &lt;&gt; "" Then tmpCol.Add oFolder.GetDetailsOf(oItem, i), arrProps(i) End If Next Exit For End If Next Set FileProperties = tmpCol Set tmpCol = Nothing Set oFolder = Nothing Set oShell = Nothing End Function 5/5