أسرع طريقة للحصول على اسم التمديد وأيقونة ملحق الملف؟

StackOverflow https://stackoverflow.com/questions/968369

  •  13-09-2019
  •  | 
  •  

سؤال

هناك العديد من الأساليب لجلب الوصف والأيقونة الافتراضية للحصول على ملحق معين (بدون مسار كامل)، على سبيل المثال عن "* .doc" أريد الحصول على "مستند Microsoft Word" والأيقونة ذات الصلة، والتي تعتقد أنها ستكون الأسرع واحدة من التالية:

  1. ابحث في التسجيل:

    • في التسجيل، انتقل إلى "HKCR. {Extension}"، اقرأ القيمة الافتراضية (دعونا نسميها
    • في "HKCR {filetype} defaulticon"، اقرأ القيمة الافتراضية: هذا هو المسار إلى ملف أيقونة (أو ملف حاوية أيقونة، مثل .exe مع مورد أيقونة مضمنة)
    • إذا لزم الأمر، استخدم الطريقة المفضلة لاستخراج مورد أيقونة من الملف المذكور.
  2. استدعاء API shgetfileinfo. أعتقد أن هذا بطيء بعض الشيء.

  3. وفقا لسرقة، هنا: كيفية الحصول على أيقونة والوصف من ملحق الملف باستخدام دلفي؟

يستدعي واجهة Iextracticon بديل "أكثر مرونة وفعالة". لكن التسلسل الذي توصي به هو استخدام واجهة Ishellfolder، ثم اتصل ب GetUioBjectof للحصول على واجهة IExtracticon في الملف، ثم استدعاء GeticonLocation واستخراجه لاسترداد مقبض الأيقونة. (ولكن هذه الطريقة لا يمكن قراءة وصف الامتداد؟)

نظرا لأن السرعة مهمة جدا لأنني بحاجة إلى قراءة المعلومات لجميع أنواع الملفات في النظام.

شكرا جزيلا!

هل كانت مفيدة؟

المحلول

أولا: هل تحصل على ملايين الرموز؟ إذا كنت ترغب في الحصول على واحدة أو بضع مئات، فهل ذلك يهم حقا ما هو الأسرع؟ كيف بطيئة بطيئة جدا؟ أفضل طريقة هي تجربة الرمز والوقت لمعرفة ما إذا كان الأمر يستحق القلق.

ثانيا: هل هناك اختلاف السرعة مشكلة حقا؟ من المرجح أن يعمل استخدام shgetfileInfo في كل إصدار من نظام التشغيل وسيكون متوافقا مع ما إذا كان مايكروسوفت تفعل الأشياء في المستقبل - قد لا يعمل قراءة السجل في بعض الحالات. كيف ستختبره؟

أخيرا، بعد أن تزن الأسئلة المذكورة أعلاه، فإن أفضل طريقة هي كتابة أسطر الكود العشرة التي سيتخذها لتجربة جميع الأساليب الثلاثة ونرى ما هو واحد أسرع.

نصائح أخرى

اتصل shgetfileinfo لكل من الوصف والرمز. من التجربة، يمكنني أن أخبرك بأن الوصول إلى السجل والبحث ببطء. أنا لا أعرف بالضبط مدى بطيء. لكن, ، كان علي أن ينتج عنه ذاكرة التخزين المؤقت لتجنب الوصول إلى التسجيل. بالإضافة إلى ذلك، فإن استرداد معلومات الملفات بشكل موثوق لجميع أنواع الملفات ليست بسيطة كما تصفها في البند رقم 1. دع shgetfileinfo تفعل العمل بالنسبة لك بشكل موثوق ونسيج ذاكرة التخزين المؤقت لتحسين الأداء كما هو موضح أدناه مع اسم نوع الملف.

أكثر من ذلك، انظر كيفية استخدام وظيفة shgetfileinfo للحصول على الرموز المرتبطة بالملفات في Visual Basic .NET في http://support.microsoft.com/kb/319340. للحصول على طريقة سهلة لاسترداد الأيقونة.

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

متأخر بعض الشيء في هذا الحزب، لكنني سأترك رابط p / invoke.net إلى shgetfileinfo هنا - http://www.pinvoke.net/default.aspx/shell32/shgetfileinfo.html.

لا يجيب على السؤال، لكن هذه الأسئلة كانت أول نتيجة جوجلتي عند البحث عن كيفية الحصول على وصف ملحق ملف.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top