Я использую метод ExtractAssociatedIcon
, чтобы получить значок для файла.Я надеюсь получить тот же значок, который увидит пользователь в своем окне проводника.
public static Icon GetIcon(string fileName)
{
try
{
Icon icon = Icon.ExtractAssociatedIcon(fileName);
return icon;
}
catch
{
return null;
}
}
Это работает в 99% случаев.Однако, если пользователь связался с файлом по общему пути, например \\SOME_SERVER\my documents\this file.pdf
, он возвращает ноль.Он проходит через «catch» с ошибкой, что путь к файлу не является допустимым путем.
Это действительный URI (я проверял, что файл существует, доступен для чтения и т. Д.), Но недопустимый полный путь к диску с обозначением X: \ some \ folder.
Как можно обойти это, если вообще?
Спасибо.
ОБНОВЛЕНИЕ
Вот решение, которое я выбрал.Это намного чище, чем первое обновление.Большое спасибо Крису Хаасу, чьим ответом был комментарий, а не прямой ответ.Если / когда он даст прямой ответ, я обновлю это так.
Мне все равно пришлось спуститься на более низкий уровень и извлечь значок через библиотеки C ++, но единственная библиотека, которая мне была нужна, перечислена ниже:
#region Old-School method
[DllImport("shell32.dll")]
static extern IntPtr ExtractAssociatedIcon(IntPtr hInst,
StringBuilder lpIconPath, out ushort lpiIcon);
public static Icon GetIconOldSchool(string fileName)
{
ushort uicon;
StringBuilder strB = new StringBuilder(fileName);
IntPtr handle = ExtractAssociatedIcon(IntPtr.Zero, strB, out uicon);
Icon ico = Icon.FromHandle(handle);
return ico;
}
#endregion
Как только я определил вышеупомянутый метод, метод GetIcon()
становится:
public static Icon GetIcon(string fileName)
{
try
{
Icon icon = Icon.ExtractAssociatedIcon(fileName);
return icon;
}
catch
{
try
{
Icon icon2 = GetIconOldSchool(fileName);
return icon2;
}
catch
{
return null;
}
}
}