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
Dim oShell As Object Dim oFolder As Object Dim oItem As Object Dim arrProps(41) Dim tmpCol As New Collection
A questo punto assegnamo gli oggetti, creando l'oggetto shell e assegnando l'oggetto folder attraverso di esso:
Set oShell = CreateObject("Shell.Application") Set oFolder = oShell.NameSpace(sPath & "")
sPath è una delle variabili che la funzione prenderà in ingresso.
Popoliamo l'array delle proprietà ciclando, attraverso un indice, le proprietà disponibili:
For i = 0 To 40 arrProps(i) = oFolder.GetDetailsOf(oFolder.Items, i) Next
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
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
Assegnamo la collection popolata risultante alla Funcion per restituirla al codice chiamante
Set FileProperties = tmpCole annulliamo tutti gli oggetti utilizzati per restituire le risorse al sistema
Set tmpCol = Nothing Set oFolder = Nothing Set oShell = Nothing
Questa è la Function completa:
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") 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
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:
Dim clProps As Collection Set clProps = FileProperties("C:\TuaCartella\TuaSottoCartella\", "TuoFile.xyz")
Una volta ottenuta la collection è possibile "interrogarla" con la chiave relativa alla proprietà da analizzare:
Debug.Print clProps("Autore") Debug.Print clProps("Data Creazione")
oppure, ancora meglio, per evitare problemi con i sistemi in lingua differente, con un indice numerico:
Debug.Print clProps(7) Debug.Print clProps(15)
In un sistema Italiano, l'elenco delle chiavi delle proprietà ottenibili è questo:
Nome
Dimensione
Tipo
Data ultima modifica
Data creazione
Data ultimo accesso
Attributi
Stato
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
























Commenti
volevoringrazia rti per il materiale che metti a disposizione.
Non sono uno sviluppatore, genero solo, da autodidatta con qualche nozione di base di VB, macro in VBA per automatizzare alcuni processi partendo da Solidworks o da Office, per cui le mie sub non sono particolarmente eleganti, ed a volte mi perdo in un bicchier d'acqua.
Ho utilizzato oggi questo codice per un problema pratico in ufficio, per cui grazie mille.
il tuo articolo è veramente interessante, ma visto che sono un neofita della programmazione, e non sò da dove partire, ti volevo chiedere se per caso avevi fatto una versione .zip del progetto contenente questo codice, così da poterlo scaricare ed usarlo per esercitarmi
Grazie mille per l'aiuto e la comprensione
Ciao Marco,
Non ho inserito il codice in un progetto .ZIP perchè in realtà non occorre.
Basta aprire un nuovo progetto Visual Basic 6, inserire un Modulo e incollarvi il codice della Function completa, ovvero quella in fondo all'archivio.
Per utilizzarla basta usare le righe già indicate nell'articolo... prova, vedrai che riesci al primo colpo
RSS feed dei commenti di questo post.