通过文件扩展名获取扩展名和图标的最快方法?

时间:2009-06-09 05:50:57

标签: windows-shell

有几种方法可以获取给定扩展名的描述和默认图标(没有完整路径),例如“* .doc”我想获得“Microsoft Word文档”和相关图标,您认为哪个是以下最快的一个:

  1. 搜索注册表:

    • 在注册表中,转到“HKCR。{extension}”,读取默认值(让我们称之为文件类型)
    • 在“HKCR {filetype} \ DefaultIcon”中,读取默认值:这是图标文件的路径(或图标容器文件,如带有嵌入图标资源的.exe)
    • 如果需要,请使用首选的方法从上述文件中提取图标资源。
  2. 调用API ShGetFileInfo。我相信这有点慢。

  3. Rob说,在这里:How to get icon and description from file extension using Delphi?

  4. 将IExtractIcon接口称为“更灵活,更高效”的替代方案。但它建议的顺序是使用IShellFolder接口,然后调用GetUIObjectOf获取文件的IExtractIcon接口,然后调用GetIconLocation和Extract来检索图标的句柄。 (但是这种方法无法读取扩展描述?)

    由于速度非常重要,因为我需要读取系统中所有文件类型的信息。

    非常感谢!

3 个答案:

答案 0 :(得分:5)

首先:您是否获得了数百万个图标?如果你得到一个或几百个,那么最快的是真的重要吗?慢得多慢?最好的方法是尝试代码并花时间查看它是否值得担心。

其次:速度差异真的是个问题吗?使用SHGetFileInfo更有可能适用于每个操作系统版本,并且将与Microsoft兼容,但Microsoft将来会做的事情 - 在某些情况下读取注册表可能不起作用。你将如何测试它?

最后,在权衡了上述问题之后,最好的方法是编写10行代码来尝试所有这三种方法,并简单地看看哪一种最快。

答案 1 :(得分:2)

为描述和图标调用SHGetFileInfo。根据经验,我可以告诉您访问和搜索注册表的速度很慢。我不知道到底有多慢。 但是,我不得不缓存结果以避免访问注册表。此外,可靠地检索所有文件类型的文件信息并不像您在第1项中描述的那样简单。让SHGetFileInfo可靠地为您完成工作并缓存结果以提高性能,如下所示,文件的类型名称。

Moreove,请参阅如何使用SHGetFileInfo函数在http://support.microsoft.com/kb/319340获取与Visual Basic .NET中的文件相关联的图标,以便轻松检索图标。

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

答案 2 :(得分:0)

我参加这个派对有点晚了,但我要把p / invoke.net链接留在SHGetFileInfo这里 - http://www.pinvoke.net/default.aspx/shell32/SHGetFileInfo.html

它没有回答这个问题,但是在搜索如何获取文件扩展名的描述时,这个问题是我的第一个google结果。