2009-06-09 4 views
0

"* .doc"와 같이 지정된 확장명 (전체 경로 없음)에 대한 설명과 기본 아이콘을 가져 오는 데는 여러 가지 방법이 있습니다. "Microsoft Word 문서"와 관련 아이콘을 얻고 싶습니다. 다음 중 가장 빠른 하나파일 확장자로 확장자 이름과 아이콘을 가져 오는 가장 빠른 방법은 무엇입니까?

  1. 레지스트리 검색 ". HKCR {확장}"레지스트리에

    • 로 이동을 기본 값을 읽어
    • (의 그것을 파일 형식 부르 자) "HKCR {filetype} \ DefaultIcon"에서 기본값을 읽습니다. 아이콘 파일의 경로 또는 아이콘이 포함되어 있습니다. 파일이 포함 된 .exe와 같은).
    • 필요한 경우 언급 한 파일에서 아이콘 리소스를 추출하는 기본 방법을 사용하십시오.
  2. Call API ShGetFileInfo. 나는 이것이 약간 천천히 일어난다 고 생각한다. 여기에 롭에 따르면,

  3. : How to get icon and description from file extension using Delphi?

는 IExtractIcon는 "보다 유연하고 효율적인"대안 인터페이스 호출합니다. 그러나 IShellFolder 인터페이스를 사용하고 GetUIObjectOf를 호출하여 파일의 IExtractIcon 인터페이스를 가져온 다음 GetIconLocation 및 Extract를 호출하여 아이콘 핸들을 검색하는 것이 좋습니다. (하지만이 방법은 확장 설명을 읽을 수 없습니다.)

시스템의 모든 파일 유형에 대한 정보를 읽어야하기 때문에 속도가 중요합니다.

대단히 감사합니다!

답변

5

첫째로, 수백만 아이콘이 있습니까? 당신이 1 ~ 수백 개를 가지고 있다면, 그것은 가장 빠른 것이 정말로 중요합니까? 얼마나 천천히 천천히? 가장 좋은 방법은 코드를 시험해보고 걱정할 가치가 있는지 알아 보는 것입니다.

둘째 : 속도 차이가 실제로 문제가됩니까? SHGetFileInfo를 사용하면 모든 운영 체제 버전에서 작동 할 가능성이 높아지고 Microsoft와 호환 될 것입니다. 레지스트리를 읽는 것이 경우에 따라 작동하지 않을 수 있습니다. 어떻게 테스트 할 예정입니까?

마지막으로 위의 질문에 무게를 두어 가장 좋은 방법은 세 가지 접근 방식 모두를 시도하고 어느 것이 가장 빠르는지 알아 보는 데 필요한 코드 10 줄을 작성하는 것입니다.

+0

+1 "테스트 테스트 및 테스트 다시" – thijs

2

설명 및 아이콘 모두에 대해 SHGetFileInfo를 호출하십시오. 경험에 비추어 볼 때 레지스트리 액세스 및 검색 속도가 느리다는 것을 알 수 있습니다. 나는 얼마나 천천히 몰라. BUT, 결과를 캐시하여 레지스트리에 액세스하지 못하게해야했습니다. 또한 모든 파일 형식에 대한 파일 정보를 안정적으로 검색하는 것은 항목 # 1에서 설명하는 것처럼 간단하지 않습니다. SHGetFileInfo가 파일의 유형 이름과 함께 아래와 같이 성능을 향상시키기 위해 안정적으로 작업하고 결과를 캐시하도록하십시오.

Moreove는 아이콘을 검색하는 쉬운 방법을 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 
0

나는 조금 늦게 파티 해요,하지만 난 그냥거야 여기 SHGetFileInfo하기 위해 P/invoke.net 링크를 남겨 - http://www.pinvoke.net/default.aspx/shell32/SHGetFileInfo.html

그것은 질문에 대답하지 않지만,이 파일 확장명에 대한 설명을 찾는 방법을 검색 할 때 질문이 처음 Google 결과가되었습니다.

관련 문제