有几种方法可以获取给定扩展名的描述和默认图标(没有完整路径),例如“* .doc”我想获得“Microsoft Word文档”和相关图标,您认为哪个是以下最快的一个:
搜索注册表:
调用API ShGetFileInfo。我相信这有点慢。
Rob说,在这里:How to get icon and description from file extension using Delphi?
将IExtractIcon接口称为“更灵活,更高效”的替代方案。但它建议的顺序是使用IShellFolder接口,然后调用GetUIObjectOf获取文件的IExtractIcon接口,然后调用GetIconLocation和Extract来检索图标的句柄。 (但是这种方法无法读取扩展描述?)
由于速度非常重要,因为我需要读取系统中所有文件类型的信息。
非常感谢!
答案 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结果。