2009-06-09 8 views
0

Il existe plusieurs approches pour récupérer la description et l'icône par défaut pour une extension donnée (pas de chemin complet), par exemple pour "* .doc" Je veux obtenir "Microsoft Word Document" et l'icône associée, qui selon vous sera le plus rapide des éléments suivants:Le moyen le plus rapide pour obtenir le nom de l'extension et l'icône par une extension de fichier?

  1. Rechercher dans le registre: "HKCR {l'extension}"

    • dans le registre, aller, lire la valeur par défaut (appelons-le filetype)
    • dans "HKCR {filetype} \ DefaultIcon", lisez la valeur par défaut: ceci est le chemin vers le fichier d'icône (ou l'icône contient fichier er, comme un fichier .exe avec une ressource d'icône incorporée)
    • si nécessaire, utilisez votre méthode préférée pour extraire la ressource d'icône du fichier mentionné.
  2. Appel de l'API ShGetFileInfo. Je crois que c'est un peu lent.

  3. Selon Rob, ici: How to get icon and description from file extension using Delphi?

appelle l'interface IExtractIcon une alternative "plus souple et plus efficace". Mais la séquence recommandée est d'utiliser une interface IShellFolder, puis appelez GetUIObjectOf pour obtenir l'interface IExtractIcon du fichier, puis appelez GetIconLocation et Extract dessus pour récupérer le handle de l'icône. (mais cette méthode ne peut pas lire la description de l'extension?)

Étant donné que la vitesse est très importante car j'ai besoin de lire les informations pour tous les types de fichiers dans le système.

Merci beaucoup!

Répondre

5

Premièrement: Recevez-vous des millions d'icônes? Si vous ne gagnez qu'une ou quelques centaines, est-ce que cela a vraiment de l'importance? Combien lent est trop lent? La meilleure façon est d'essayer le code et de le chronométrer pour voir si cela vaut la peine de s'inquiéter. Deuxièmement: La différence de vitesse est-elle vraiment un problème? L'utilisation de SHGetFileInfo est plus susceptible de fonctionner sur toutes les versions du système d'exploitation et sera compatible avec Microsoft mais à l'avenir - La lecture du registre peut ne pas fonctionner dans certains cas. Comment allez-vous le tester? Enfin, après avoir pesé les questions ci-dessus, la meilleure approche consiste à écrire les 10 lignes de code qu'il faudra pour essayer les trois approches et voir laquelle est la plus rapide.

+0

+1 pour "Test de test et test à nouveau" – thijs

2

Appelez SHGetFileInfo à la fois pour la description et l'icône. Par expérience, je peux vous dire que l'accès et la recherche dans le registre sont lents. Je ne sais pas exactement comment lent. MAIS, j'ai dû mettre en cache les résultats pour éviter d'accéder au registre. En outre, la récupération fiable des informations sur les fichiers pour tous les types de fichiers n'est pas aussi simple que celle que vous décrivez dans l'élément n ° 1. Laissez SHGetFileInfo effectuer le travail pour vous de manière fiable et cachez les résultats pour améliorer les performances comme indiqué ci-dessous avec le nom de type du fichier.

Moreove, voir Comment utiliser la fonction SHGetFileInfo pour obtenir les icônes qui sont associés à des fichiers dans Visual Basic .NET à http://support.microsoft.com/kb/319340 pour un moyen facile de récupérer l'icône.

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