我正在使用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
,则返回null。它通过“catch”落入文件路径不是有效路径的错误。
这是一个有效的URI(我已验证该文件存在,是否可读等),但不是具有X:\ some \文件夹符号的有效完全限定的驱动器路径。
如果有的话,我该如何解决这个问题呢?
感谢。
的重新更新 的
这是我最终解决的问题。它比第一次更新更清洁。非常感谢Chris Haas,他的回答是评论,而不是直接回答。如果/当他直接回答时,我会这样更新。
我仍然需要下到较低级别并通过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;
}
}
}
答案 0 :(得分:2)
(评论转变为后CTIP)
使用以下代码查看最终通向link here的P/Invoke.net:
[DllImport("shell32.dll")]
static extern IntPtr ExtractAssociatedIcon(IntPtr hInst, StringBuilder lpIconPath, out ushort lpiIcon);
[DllImport("shell32.dll")]
static extern IntPtr ExtractIcon(IntPtr hInst, string lpszExeFileName, int nIconIndex);
_
ushort uicon;
StringBuilder strB = new StringBuilder(YOUR_FILE_PATH);
IntPtr handle = ExtractAssociatedIcon(this.Handle, strB, out uicon);
Icon ico = Icon.FromHandle(handle);
return ico.ToBitmap();