TheTruster's Box

  • Increase font size
  • Default font size
  • Decrease font size
Home Programmazione Articoli Estrarre Extended Properties da un File con Visual Basic 6

Estrarre Extended Properties da un File con Visual Basic 6

E-mail Stampa PDF

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 = tmpCol


e 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

  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 & "")
  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
  15. If arrProps(i) <> "" Then
  16. tmpCol.Add oFolder.GetDetailsOf(oItem, i), arrProps(i)
  17. End If
  18. Next
  19. Exit For
  20. End If
  21. Next
  22. Set FileProperties = tmpCol
  23. Set tmpCol = Nothing
  24. Set oFolder = Nothing
  25. Set oShell = Nothing
  26. End Function
 

Commenti  

 
+2 #1 2011-01-28 09:56
Ciao,
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.
Citazione
 
 
0 #2 2011-07-28 08:41
Ciao

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
Citazione
 
 
0 #3 TheTruster 2011-07-28 09:56
Citazione Marco:
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


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
Citazione
 

Aggiungi commento

Si prega di aggiungere commenti in tema.
Sono assolutamente vietati messaggi volgari, pubblicitari e/o promozionali.
I commenti ritenuti non conformi saranno rimossi.


Codice di sicurezza
Aggiorna

Sondaggio

Cosa vorresti vedere di più su TheTruster's Box?
 

Utenti on-line

 2 visitatori online

MasterDrive.it



Aggiungi TheTruster's Box ai preferiti!