【问题标题】:Fastest way to get the extension name and icon by an file extension?通过文件扩展名获取扩展名和图标的最快方法?
【发布时间】:2012-05-11 02:24:56
【问题描述】:

有几种方法可以获取给定扩展名的描述和默认图标(没有完整路径),例如对于“*.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?

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

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

非常感谢!

【问题讨论】:

    标签: windows-shell


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

      为描述和图标调用 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
      

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-11-27
          • 2016-01-09
          • 2018-11-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多