1

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

  1. 搜索注册表:

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

  3. 根据 Rob 的说法,这里:如何使用 Delphi 从文件扩展名中获取图标和描述?

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

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

非常感谢你!

4

3 回答 3

6

首先:你有数以百万计的图标吗?如果您只获得一个或几百个,那么哪个最快真的重要吗?太慢有多慢?最好的方法是尝试代码并计时,看看是否值得担心。

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

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

于 2009-06-09T06:31:53.117 回答
3

为描述和图标调用 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
于 2009-12-06T21:06:54.670 回答
0

我参加这个聚会有点晚了,但我只想在这里留下指向 SHGetFileInfo 的 p/invoke.net 链接 - http://www.pinvoke.net/default.aspx/shell32/SHGetFileInfo.html

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

于 2012-05-10T18:24:56.410 回答