1

特定の拡張子 (フル パスなし) の説明と既定のアイコンを取得するには、いくつかの方法があります。たとえば、"*.doc" の場合、"Microsoft Word ドキュメント" と関連するアイコンを取得したいのですが、どちらが最速だと思いますか?次のいずれか:

  1. レジストリを検索します。

    • レジストリで、「HKCR.{拡張子}」に移動し、デフォルト値を読み取ります(ファイルタイプと呼びましょう)
    • "HKCR{filetype}\DefaultIcon" で、デフォルト値を読み取ります。これは、アイコン ファイル (または、アイコン リソースが埋め込まれた .exe などのアイコン コンテナー ファイル) へのパスです。
    • 必要に応じて、前述のファイルからアイコン リソースを抽出するお好みの方法を使用してください。
  2. API ShGetFileInfo を呼び出します。これは少し遅いと思います。

  3. ロブによると、ここ: Delphi を使用してファイル拡張子からアイコンと説明を取得する方法は?

IExtractIcon インターフェイスを「より柔軟で効率的な」代替手段として呼び出します。ただし、推奨される順序は、IShellFolder インターフェイスを使用し、次に GetUIObjectOf を呼び出してファイルの IExtractIcon インターフェイスを取得し、それに対して GetIconLocation と Extract を呼び出してアイコンのハンドルを取得することです。(しかし、このメソッドは拡張機能の説明を読み取ることができませんか?)

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

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

4

3 に答える 3

6

まず、何百万ものアイコンを取得していますか? 1 つまたは数百しか得られない場合、どちらが速いかは本当に重要ですか? 遅すぎるとはどのくらい遅いですか?最善の方法は、コードを試して時間を計って、心配する価値があるかどうかを確認することです。

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

最後に、上記の質問を比較検討した上で、最善の方法は、3 つの方法すべてを試してどれが最も速いかを確認するために必要な 10 行のコードを記述することです。

于 2009-06-09T06:31:53.117 に答える
3

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

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

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
于 2009-12-06T21:06:54.670 に答える
0

このパーティーには少し遅れましたが、SHGetFileInfo への p/invoke.net リンクをここに残しておきます - http://www.pinvoke.net/default.aspx/shell32/SHGetFileInfo.html

質問には答えませんが、この質問は、ファイル拡張子の説明を取得する方法を検索したときの最初の Google 検索結果でした。

于 2012-05-10T18:24:56.410 に答える