2009-06-09 12 views
0

「* .doc」のように、特定の拡張子(フルパスなし)の説明とデフォルトアイコンを取得するには、いくつかの方法があります。「Microsoft Word文書」と関連するアイコンを取得したいと思います次の最速1:拡張子の名前とアイコンをファイル拡張子で取得する最速の方法は?

  1. は、レジストリ検索: "HKCR {拡張子}" レジストリ内の

    • 、に行くを、デフォルト値を読み
    • (のは、それがファイルタイプと呼びましょう) "HKCR {filetype} \ DefaultIcon"で、デフォルト値を読み取ります。これはアイコンファイルへのパスです。ファイルが埋め込まれた.exeのように)
    • 必要に応じて、上記のファイルからアイコンリソースを抽出する方法を使用してください。
  2. コールAPI ShGetFileInfo。私はこれが少し遅いと信じています。

  3. ロブによると、ここに:How to get icon and description from file extension using Delphi?

はIExtractIcon "は、より柔軟で効率的な" 代替のインターフェースを呼び出します。ただし、IShellFolderインターフェイスを使用し、GetUIObjectOfを呼び出してファイルのIExtractIconインターフェイスを取得し、GetIconLocationとExtractを呼び出してアイコンのハンドルを取得することをお勧めします。 (ただし、この方法では内線番号の説明は読み取れません)

システム内のすべてのファイルタイプの情報を読む必要があるため、速度は非常に重要です。

ありがとうございました!

答えて

5

まず、数百万のアイコンが表示されていますか?あなたが1〜数百を得ているなら、それは本当に重要なのですか?どのくらい遅いですか?最善の方法は、コードを試して、それが心配する価値があるかどうかを確認することです。

2番目:速度の違いは本当に問題ですか? SHGetFileInfoを使用すると、すべてのオペレーティングシステムのバージョンで動作する可能性が高くなりますが、将来的にはMicrosoftと互換性があります。レジストリを読むことがうまくいかない場合があります。どうやってテストしますか?

最後に、上記の質問を検討した上で、最善のアプローチは、3つのアプローチを試して、どれが最速かを簡単に確認するために必要な10行のコードを書くことです。

+0

+1 "テストテストとテストの再試行" – thijs

2

SHGetFileInfoを説明とアイコンの両方で呼び出します。経験から、レジストリのアクセスと検索が遅いことがわかります。私は正確にどのくらい遅いかわかりません。 BUT、私はレジストリへのアクセスを避けるために結果をキャッシュしなければならなかった。さらに、すべてのファイルタイプのファイル情報を確実に取得することは、項目#1で説明したように簡単ではありません。 SHGetFileInfoがあなたのために作業を確実に行い、結果をキャッシュして、ファイルのタイプ名とともに以下に示すようにパフォーマンスを向上させます。

Moreove、アイコンを取得する簡単な方法をhttp://support.microsoft.com/kb/319340でのVisual Basic .NETでファイルに関連付けられたアイコンを取得するためにSHGetFileInfo関数を使用する方法を参照してください。

私は少し遅れて、このパーティにだけど、私はただここにSHGetFileInfoへのp/invoke.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 
関連する問題