获取文件图标是C#中经常用到的一个功能,本篇攻略将介绍如何使用C#从操作系统中获取文件图标。
获取文件图标的方法
在C#中,我们可以使用如下两种方法来获取文件图标:
1.使用Icon.ExtractAssociatedIcon
方法
Icon.ExtractAssociatedIcon
方法用于从指定文件的关联程序中提取出图标:
string filePath = @"C:\Windows\notepad.exe";
Icon icon = Icon.ExtractAssociatedIcon(filePath);
上述代码将从Windows计算机的C:\Windows
目录中加载notepad.exe
程序,并提取其关联图标。结果以Icon
对象的形式返回,可以通过该对象获取图标的各种信息:大小、颜色深度等。
2.使用SHGetFileInfo
方法
SHGetFileInfo
方法是Win32API中的一个函数,其可以从操作系统中获取文件的各种属性,包括文件名、大小、图标等。在C#中,我们可以通过P/Invoke方式来调用该函数:
[DllImport("shell32.dll")]
public static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags);
[StructLayout(LayoutKind.Sequential)]
public struct SHFILEINFO
{
public IntPtr hIcon;
public int iIcon;
public uint dwAttributes;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
public string szDisplayName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
public string szTypeName;
}
const uint SHGFI_ICON = 0x000000100; // Get icon
const uint SHGFI_LARGEICON = 0x000000000; // Get large icon
const uint SHGFI_SMALLICON = 0x000000001; // Get small icon
string filePath = @"C:\Windows\notepad.exe";
SHFILEINFO shfi = new SHFILEINFO();
IntPtr hIcon = SHGetFileInfo(filePath, 0, ref shfi, (uint)Marshal.SizeOf(shfi), SHGFI_ICON | SHGFI_LARGEICON);
Icon icon = Icon.FromHandle(shfi.hIcon);
上述代码利用了SHGetFileInfo
函数中的SHFILEINFO
结构体来获取文件的属性,其中hIcon
成员变量即为文件的图标句柄,我们可以通过Icon.FromHandle
方法将它转换为Icon
对象。
示例说明
以下是两个获取文件图标的示例:
示例一:添加文件的图标到ListView控件中
string filePath = @"C:\Windows\notepad.exe";
Icon icon = Icon.ExtractAssociatedIcon(filePath);
imageList1.Images.Add(icon);
int index = imageList1.Images.Count - 1;
listView1.Items.Add(new ListViewItem("Notepad", index));
上述代码将从Windows计算机的C:\Windows
目录中加载notepad.exe
程序,并提取其关联图标。将获取到的图标添加到imageList1
控件中,并将一个ListViewItem
对象加入listView1
控件中,该对象包含文件名和图标的索引值即可。
示例二:封装文件图标获取类
我们可以将获取文件图标的方法封装到一个类中,使得在其他地方使用更加方便。
class FileIcon
{
[DllImport("shell32.dll")]
public static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags);
[StructLayout(LayoutKind.Sequential)]
public struct SHFILEINFO
{
public IntPtr hIcon;
public int iIcon;
public uint dwAttributes;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
public string szDisplayName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
public string szTypeName;
}
const uint SHGFI_ICON = 0x000000100;
const uint SHGFI_LARGEICON = 0x000000000;
const uint SHGFI_SMALLICON = 0x000000001;
public static Icon GetIcon(string filePath, bool largeIcon)
{
SHFILEINFO shfi = new SHFILEINFO();
uint flags = SHGFI_ICON | (largeIcon ? SHGFI_LARGEICON : SHGFI_SMALLICON);
IntPtr hIcon = SHGetFileInfo(filePath, 0, ref shfi, (uint)Marshal.SizeOf(shfi), flags);
return Icon.FromHandle(shfi.hIcon);
}
}
上述代码封装了获取文件图标的方法,并定义了一个GetIcon
静态函数,调用该函数,即可根据指定的文件路径和图标大小类型获取对应文件的图标。如下为该函数的使用示例:
string filePath = @"C:\Windows\notepad.exe";
Icon iconLarge = FileIcon.GetIcon(filePath, true);
Icon iconSmall = FileIcon.GetIcon(filePath, false);
pictureBox1.Image = iconLarge.ToBitmap();
pictureBox2.Image = iconSmall.ToBitmap();
在上述示例中,通过调用FileIcon.GetIcon
函数,获取到了计算机中C:\Windows\notepad.exe
程序的大图标和小图标,并将它们显示在两个PictureBox
控件中。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#中如何获取文件图标 - Python技术站