четверг, 23 июля 2015 г.

C#. Извлечение ассоциированной с файлом иконки

[C#. Icon associated with files]

Большинство решений, которые я находил для получения иконки, ассоциированной с файлом, используют системные функции напрямую. Но есть и стандартные средства, с помощью которых это можно сделать наверное даже еще проще. А именно используя метод Icon.ExtractAssociatedIcon (https://msdn.microsoft.com/en-US/library/system.drawing.icon.extractassociatedicon.aspx)

Итак, небольшой и понятный код:


public class AssociatedIconService
{
    const string SUB_FOLDER = "AssociatedIcon";
    String tmpFolder = null;
    Dictionary<String, Icon> extToIconDict = new Dictionary<string, Icon>(); // cache

    public AssociatedIconService() {
        tmpFolder = Path.Combine(CommonInfo.AppTempFolderPath, SUB_FOLDER);
    }

    public Icon GetAssociatedIconByFileName(string fileName) {
        if (String.IsNullOrEmpty(fileName)) return null;

        // define key (short filename with extension)
        String shortFileName = "file";

        String extens = Path.GetExtension(fileName);
        if (String.IsNullOrEmpty(extens) == false)
            shortFileName += extens;

        if (extToIconDict.ContainsKey(shortFileName) == false) {
            // crete empty file if not exists
            String fullName = Path.Combine(tmpFolder, shortFileName);

            if (Directory.Exists(tmpFolder) == false) { Directory.CreateDirectory(tmpFolder); }
            if (File.Exists(fullName) == false) { File.Create(fullName).Dispose(); }

            // extract icon into cache
            extToIconDict[shortFileName] = Icon.ExtractAssociatedIcon(fullName);
        }

        return extToIconDict[shortFileName];
    }

}