Rubrik: Dateisystem · Dateien - allgemein | VB-Versionen: VB2019 - VB2022 | 16.03.24 |
Ermitteln spezieller File-Informationen via ShellInfo Es wird gezeigt, wie man spezielle Informationen zu einem File mittels ShellInfo ermitteln kann. | ||
Autor: Dietrich Herrmann | Bewertung: | Views: 958 |
ohne Homepage | System: Win7, Win8, Win10, Win11 | kein Beispielprojekt |
Ich benötige bspw. die Information "Länge" zu einem Audio- oder Videofile. Diese Daten kann man nicht über FileInfo bekommen. Die Lösung zu diesem Problem fand ich auf folgendem Link, die ich programmtechnisch noch etwas erweitert habe, und die ich mittlerweile gut praktisch anwende.
Hier der originale Link:
https://stackoverflow.com/questions/26142723/get-extended-file-information-details
Benötigt wird noch der Verweis auf COM Microsoft Shell Controls And Automation.
Der Code:
Friend Class ShellInfo Public Property Name As String Public Property Value As String Public Property Index As Short Public Sub New(n As String, v As String, x As Short) Name = n Value = v Index = x End Sub Public Overrides Function ToString() As String Return Name End Function End Class
''' <summary> ''' Ermitteln der aller oder eines Teils der ShellInfos eines Files ''' </summary> ''' <param name="filepath">der Filename inkl. Pfad</param> ''' <param name="theFilter">ein Filter, zum ermitteln spezieller Infos</param> ''' <returns>die Liste der ShellInfos</returns> ''' <param name="Of"></param> Public Function GetXtdShellInfo(filepath As String, Optional theFilter As Array = Nothing) _ As List(Of ShellInfo) Dim xxx As New List(Of ShellInfo) Dim shell As New Shell32.Shell, shFolder As Shell32.Folder shFolder = shell.NameSpace(Path.GetDirectoryName(filepath)) Dim key As String, ndx As Short For Each s As Object In shFolder.Items If shFolder.GetDetailsOf(s, 0).ToLowerInvariant _ = Path.GetFileName(filepath).ToLowerInvariant Then ndx = 0 key = shFolder.GetDetailsOf(shFolder.Items, ndx) ' Je nach Betriebssystem gibt es eine unterschiedliche Anzahl an Einträgen ' (Bspw. W7=290, W8=309, ebenso W=11 mit einigen Lücken.) ' Dies sollte bis zu 310 nicht leere Elemente ergeben Do Until String.IsNullOrEmpty(key) AndAlso ndx > 310 If String.IsNullOrEmpty(key) = False Then If Not IsNothing(theFilter) Then If Array.IndexOf(theFilter, key) >= 0 Then xxx.Add(New ShellInfo(key, shFolder.GetDetailsOf(s, ndx), ndx)) End If Else xxx.Add(New ShellInfo(key, shFolder.GetDetailsOf(s, ndx), ndx)) End If End If ndx += 1 key = shFolder.GetDetailsOf(shFolder.Items, ndx) If key <> "" Then Debug.Print((ndx - 1) & vbTab & key) Loop Exit For End If Next Return xxx End Function
- filePath: das zu untersuchende File mit komplettem Pfad
- theFilter: ein Stringfeld variabler Länge, das die interessierenden Informationen adressiert
In der Anwendung:
Dim xtd As List(Of ShellInfo) Dim shellFilter() As String = {"Bildbreite", "Bildhöhe", "Länge"} ' für ein Video ... xtd = GetXtdShellInfo("myFile", shellFilter)