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;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) &amp;lt;&amp;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