Читая различные ответы здесь и в других местах, я собрал этот бит, чтобы получить метаданные файла, которые мне нужны:
Public Class windows_metadata_helper
Public Shared shell As New Shell32.Shell
Public Shared indices_of_interest As New Dictionary(Of Integer, String)
Public Shared path_index As Integer
Shared Sub New()
'snipped long piece code for figuring out the indices of the attributes that I need, they are stored in indices_of_interest, for example 0:Name
End Sub
Public Shared Function get_interesting_data(path) As Dictionary(Of String, String)
Dim fi As New IO.FileInfo(path)
Dim f_dir = shell.NameSpace(fi.DirectoryName)
Dim data As New Dictionary(Of String, String)
For Each item In f_dir.Items()
If f_dir.GetDetailsOf(item, path_index) = fi.FullName Then
For Each kvp In indices_of_interest
Dim val = f_dir.GetDetailsOf(item, kvp.Key)
If Not String.IsNullOrEmpty(val) Then data.Add(kvp.Value, val)
Next
Exit For
End If
Next
Return data
End Function
End Class
Это не самый эффективный код в мире, а именно получение атрибута пути каждого файла в каталоге, чтобы идентифицировать файл, который мне действительно интересен. Оптимизация позволяет только читать атрибут пути каждого файла, как только он обходит его. На 50% быстрее (тестируется, позволяя ему взять первый файл, который он находит, является ли он правильным или нет), но независимо от этого, он намного медленнее, чем ожидалось.
Необходимо извлечь 24 атрибута из каждого файла и найти около 20 тыс. Файлов из ~ 100 тыс., В настоящее время это занимает целый час.
Профилирование говорит мне, что ЦП является узким местом, и что бы ни занимало циклы, которые я не вижу, поскольку его 99% внутри метода Shell32.Folder.GetDetailsOf.
Есть ли более быстрый способ получения метаданных? Ответ не должен быть специфичным для vb или .net.