2009-06-09 6 views
0

Es gibt mehrere Ansätze, um die Beschreibung und Standard-Icon für eine bestimmte Erweiterung (kein vollständiger Pfad) zu holen, zB für "* .doc" Ich möchte "Microsoft Word-Dokument" und das zugehörige Symbol erhalten die schnellste sie eine der folgenden:Schnellster Weg, um den Namen und das Symbol der Erweiterung durch eine Dateierweiterung zu erhalten?

  1. der Registrierung suchen: "HKCR {extension}"

    • in der Registry, gehen sie auf den Standardwert lesen (nennen wir es filetype)
    • in "HKCR {filetype} \ DefaultIcon", lesen Sie den Standardwert: Dies ist der Pfad zu der Symboldatei (oder das Symbol enthalten er Datei, wie eine .exe mit einer eingebetteten Symbolressource)
    • Verwenden Sie bei Bedarf die bevorzugte Methode zum Extrahieren der Symbolressource aus der genannten Datei.
  2. Aufruf API ShGetFileInfo. Ich glaube, das ist ein bisschen langsam.

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

Ruft die IExtractIcon Schnittstelle ein "flexibler und effizienter" Alternative. Die empfohlene Reihenfolge besteht jedoch darin, eine IShellFolder-Schnittstelle zu verwenden. Rufen Sie dann GetUIObjectOf auf, um die IExtractIcon-Schnittstelle der Datei abzurufen, und rufen Sie anschließend GetIconLocation und Extract dazu auf, um das Handle des Symbols abzurufen. (aber diese Methode kann die Erweiterung Beschreibung nicht lesen?)

Da die Geschwindigkeit ist sehr wichtig, weil ich die Informationen für alle Dateitypen im System lesen müssen.

Vielen Dank!

Antwort

5

Erstens: Erhalten Sie Millionen von Icons? Wenn du nur ein oder ein paar hundert bekommst, ist es dann wirklich wichtig, welches am schnellsten ist? Wie langsam ist zu langsam? Der beste Weg ist es, den Code zu testen und zu überprüfen, ob es sich lohnt, sich darüber Gedanken zu machen.

Zweitens: Ist der Geschwindigkeitsunterschied wirklich ein Problem? Die Verwendung von SHGetFileInfo funktioniert mit höherer Wahrscheinlichkeit bei jeder Betriebssystemversion und ist mit Microsoft kompatibel. In manchen Fällen funktioniert das Lesen der Registrierung jedoch möglicherweise nicht. Wie werden Sie es testen?

Schließlich, nach Abwägung der oben genannten Fragen, ist der beste Ansatz, die 10 Codezeilen zu schreiben, die es dauern wird, alle drei Ansätze zu versuchen und einfach zu sehen, welche am schnellsten ist.

+0

+1 für "Test testen und erneut testen" – thijs

2

Rufen Sie SHGetFileInfo für Beschreibung und Symbol auf. Aus Erfahrung kann ich Ihnen sagen, dass der Zugriff und die Suche in der Registrierung langsam ist. Ich weiß nicht genau, wie langsam. ABER, musste ich Ergebnisse zwischenspeichern, um den Zugriff auf die Registrierung zu vermeiden. Darüber hinaus ist das zuverlässige Abrufen von Dateiinformationen für alle Dateitypen nicht so einfach wie in Artikel 1 beschrieben. Lassen Sie SHGetFileInfo die Arbeit für Sie zuverlässig erledigen und speichern Sie die Ergebnisse, um die Leistung zu verbessern, wie unten mit dem Typnamen der Datei gezeigt.

Moreove finden Wie die SHGetFileInfo Funktion verwenden, um die Symbole zu erhalten, die mit Dateien in Visual Basic .NET bei http://support.microsoft.com/kb/319340 für eine einfache Möglichkeit des Abrufens des Symbols zugeordnet ist.

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 
Verwandte Themen