Самый быстрый способ получить имя и значок расширения по расширению файла? - PullRequest
0 голосов
/ 09 июня 2009

Существует несколько подходов для получения описания и значка по умолчанию для данного расширения (без полного пути), например, для «* .doc» я хочу получить «Документ Microsoft Word» и связанный значок, который, как вы думаете, будет быть самым быстрым из следующих:

  1. Поиск в реестре:

    • в реестре, перейдите к «HKCR. {Extension}», прочитайте значение по умолчанию (назовем его тип файла)
    • в "HKCR {filetype} \ DefaultIcon" прочитайте значение по умолчанию: это путь к файлу значка (или файлу контейнера значка, например .exe со встроенным ресурсом значка)
    • при необходимости используйте предпочитаемый метод извлечения ресурса значка из упомянутого файла.
  2. Вызовите API ShGetFileInfo. Я считаю, что это немного медленно.

  3. По словам Роба, здесь: Как получить значок и описание из расширения файла с помощью Delphi?

Называет интерфейс IExtractIcon «более гибкой и эффективной» альтернативой. Но рекомендуемая последовательность состоит в том, чтобы использовать интерфейс IShellFolder, затем вызвать GetUIObjectOf для получения интерфейса IExtractIcon файла, а затем вызвать GetIconLocation и Extract для него, чтобы получить дескриптор значка. (но этот метод не может прочитать описание расширения?)

Поскольку скорость очень важна, потому что мне нужно прочитать информацию для всех типов файлов в системе.

Большое спасибо!

Ответы [ 3 ]

5 голосов
/ 09 июня 2009

Во-первых: вы получаете миллионы иконок? Если вы получаете только одну или несколько сотен, тогда действительно ли важно, какой из них самый быстрый? Как медленно, слишком медленно? Лучший способ - попробовать код и рассчитать время, чтобы понять, стоит ли о нем беспокоиться.

Во-вторых: действительно ли разница в скорости является проблемой? Использование SHGetFileInfo, скорее всего, будет работать на каждой версии операционной системы и будет совместимо с тем, что Microsoft сделает в будущем - чтение реестра может не работать в некоторых случаях. Как вы это проверите?

Наконец, взвесив вышеприведенные вопросы, лучший подход - написать 10 строк кода, которые понадобятся, чтобы попробовать все три подхода, и просто посмотреть, какой из них наиболее быстрый.

2 голосов
/ 07 декабря 2009

Вызовите SHGetFileInfo для описания и значка. По опыту могу сказать, что доступ к реестру и поиск в нем медленные. Я не знаю точно, как медленно. НО , мне пришлось кэшировать результаты, чтобы избежать доступа к реестру. Кроме того, надежное получение информации о файлах для всех типов файлов не так просто, как описано в пункте №1. Позвольте SHGetFileInfo надежно выполнить всю работу за вас и кэшировать результаты, чтобы повысить производительность, как показано ниже с именем типа файла.

Подробнее см. Как использовать функцию SHGetFileInfo для получения значков, связанных с файлами в Visual Basic .NET в http://support.microsoft.com/kb/319340, для простого способа получения значка.

Private Shared _descriptions As New Dictionary(Of String, String)

Private Shared Function CacheDocumentDescription(ByVal extension As String, ByVal description As String) As String
    _descriptions.Add(extension, description)
    DumpCacheDocumentItem(extension, description, "added")
    Return description
End Function

<Conditional("DbCacheDocument")> _
Private Shared Sub DumpCacheDocumentItem(ByVal extension As String, ByVal description As String, ByVal category As String)
    Debug.WriteLine(extension & ", " & description, category)
End Sub

Public Shared Function GetTypeName(ByVal fullPath As String) As String

    Dim sExt As String = System.IO.Path.GetExtension(fullPath)

    If Len(sExt) = 0 Then
        Return "File"
    End If

    If _descriptions.ContainsKey(sExt) Then
        'return cached value
        Return _descriptions.Item(sExt)
    End If

    Dim sDocDescription As String = Missico.Shell.ShellFileInfo.TypeName(fullPath)

    Return CacheDocumentDescription(sExt, sDocDescription)
End Function
0 голосов
/ 10 мая 2012

Я немного опоздал на эту вечеринку, но я просто оставлю ссылку p / invoke.net на SHGetFileInfo здесь - http://www.pinvoke.net/default.aspx/shell32/SHGetFileInfo.html

Он не отвечает на вопрос, но этот вопрос был моим первым результатом в Google при поиске, как получить описание для расширения файла.

...