2009-06-09 193 views
0

有几种方法可以获取给定扩展的描述和默认图标(没有完整路径),例如“* .doc”我想获得“Microsoft Word Document”和相关的图标,您认为这将是下面最快的国家之一:通过文件扩展名获取扩展名和图标的最快方法?

  1. 搜索注册表: “HKCR {分机}”

      在注册表
    • ,去,读取默认值(我们称之为对文件类型)
    • 在“HKCR {filetype} \ DefaultIcon”中,读取默认值:这是图标文件的路径(或图标包含er文件,就像带有嵌入式图标资源的.exe一样)
    • 如果需要,请使用您的首选方法从所提及的文件中提取图标资源。
  2. 调用API ShGetFileInfo。我相信这有点慢。

  3. 据罗布,在这里:How to get icon and description from file extension using Delphi?

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

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

非常感谢!

回答

5

首先:你是否获得了数百万的图标?如果你想得到一个或几百个,那么最重要的是哪个真的很重要?慢多慢?最好的方法是尝试一下代码并查看它是否值得担心。第二:速度差异真的是一个问题吗?使用SHGetFileInfo更有可能适用于每个操作系统版本,并且将与Microsoft将来的事情兼容 - 在某些情况下阅读注册表可能无法正常工作。你将如何测试它?

最后,考虑到上述问题,最好的方法是编写10行代码,它将尝试所有三种方法,并简单地了解哪一种方法最快。

+0

+1表示“再次测试测试” – thijs 2009-06-09 06:35:55

2

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

Moreove,看到如何使用的SHGetFileInfo函数来获取与文件在Visual Basic .NEThttp://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