C# · 12月 30, 2021

C#中如何获取文件图标

本文给大家介绍如何去获取一个文件的关联图标呢?现总结如下:

  首先明确问题:获取一个文件的关联图标或者是某个类型文件的显示图标。

  在网上搜了一圈,发现方法还是比较多的,但是应用C#进行获取的方法不多。我选择一种用.Net库的方法。

 使用的类:

    System.Drawing.Icon ,位于System.Drawing 命名空间。

  具体方法:  

    System.Drawing.Icon 类中的静态方法:public static Icon ExtractAssociatedIcon(string filePath)

  此方法接收一个文件路径,返回一个 Icon 类型的对象。此对象既是指定文件的 Icon 图标对象。

  此 Icon 类提供了 Save 方法,可以将 Icon 文件写入流中,进而保存至硬盘文件。

  当然要在程序中显示也是可以的,Icon 类提供了 ToBitmap 方法,可以将 Icon 文件转换为 Bitmap。Bitmap 就可以在 Picture@R_986_2419@ 中显示了。

  如果要根据后缀名来获取文件图标,那要怎么办呢?我想了一个比较笨的办法。看代码~

string fileName = “tmp.” + houzhuiming;    File.Create(fileName).Close();    Image img = System.Drawing.Icon.ExtractAssociatedIcon(fileName).ToBitmap();    File.Delete(fileName);

  如此,新建一个指定后缀名的文件,获取图标后直接删除,就能获得指定文件后缀名的图标了。嘻嘻~

下面给大家分享一段代码介绍C#获取文件关联图标

using System;using System.Collections.Generic;using System.Text;using System.Runtime.InteropServices;using System.Drawing;using Microsoft.Win32;namespace ifmdp.DeviceManager{class SystemIcon{[StructLayout(LayoutKind.Sequential,CharSet = CharSet.Auto)]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;}[DllImport(“Shell32.dll”,EntryPoint = “SHGetFileInfo”,SetLastError = true,CharSet = CharSet.Auto)]public static extern IntPtr SHGetFileInfo(string pszPath,uint dwFileAttributes,ref SHFILEINFO psfi,uint cbFileInfo,uint uFlags);[DllImport(“User32.dll”,EntryPoint = “DestroyIcon”)]public static extern int DestroyIcon(IntPtr hIcon);#region API 参数的常量定义public enum FileInfoFlags : uint{SHGFI_ICON = 0x000000100,// get iconSHGFI_DISPLAYNAME = 0x000000200,// get display nameSHGFI_TYPENAME = 0x000000400,// get type nameSHGFI_ATTRIBUTES = 0x000000800,// get attributesSHGFI_ICONLOCATION = 0x000001000,// get icon locationSHGFI_EXETYPE = 0x000002000,// return exe typeSHGFI_SYSICONINDEX = 0x000004000,// get system icon indexSHGFI_LINKOVERLAY = 0x000008000,// put a link overlay on iconSHGFI_SELECTED = 0x000010000,// show icon in selected stateSHGFI_ATTR_SPECIFIED = 0x000020000,// get only specified attributesSHGFI_LARGEICON = 0x000000000,// get large iconSHGFI_SMALLICON = 0x000000001,// get small iconSHGFI_OPENICON = 0x000000002,// get open iconSHGFI_SHELLICONSIZE = 0x000000004,// get shell size iconSHGFI_PIDL = 0x000000008,// pszPath is a pidlSHGFI_USEFILEATTRIBUTES = 0x000000010,// use passed dwFileAttributeSHGFI_ADDOVERLAYS = 0x000000020,// apply the appropriate overlaysSHGFI_OVERLAYINDEX = 0x000000040 // Get the index of the overlay}public enum FileAttributeFlags : uint{FILE_ATTRIBUTE_READONLY = 0x00000001,FILE_ATTRIBUTE_HIDDEN = 0x00000002,FILE_ATTRIBUTE_SYstem = 0x00000004,FILE_ATTRIBUTE_DIRECTORY = 0x00000010,FILE_ATTRIBUTE_ARCHIVE = 0x00000020,FILE_ATTRIBUTE_DEVICE = 0x00000040,FILE_ATTRIBUTE_NORMAL = 0x00000080,FILE_ATTRIBUTE_TEMPORARY = 0x00000100,FILE_ATTRIBUTE_SPARSE_FILE = 0x00000200,FILE_ATTRIBUTE_REPARSE_POINT = 0x00000400,FILE_ATTRIBUTE_COMPRESSED = 0x00000800,FILE_ATTRIBUTE_OFFLINE = 0x00001000,FILE_ATTRIBUTE_NOT_CONTENT_INDEXED = 0x00002000,FILE_ATTRIBUTE_ENCRYPTED = 0x00004000}#endregion/// <summary>/// 获取文件类型的关联图标/// </summary>/// <param name=”fileName”>文件类型的扩展名或文件的绝对路径</param>/// <param name=”isLargeIcon”>是否返回大图标</param>/// <returns>获取到的图标</returns>public static Icon GetIcon(string fileName,bool isLargeIcon){SHFILEINFO shfi = new SHFILEINFO();IntPtr hI;if (isLargeIcon)hI = SHGetFileInfo(fileName,ref shfi,(uint)Marshal.SizeOf(shfi),(uint)FileInfoFlags.SHGFI_ICON | (uint)FileInfoFlags.SHGFI_USEFILEATTRIBUTES | (uint)FileInfoFlags.SHGFI_LARGEICON);elsehI = SHGetFileInfo(fileName,(uint)FileInfoFlags.SHGFI_ICON | (uint)FileInfoFlags.SHGFI_USEFILEATTRIBUTES | (uint)FileInfoFlags.SHGFI_SMALLICON);Icon icon = Icon.FromHandle(shfi.hIcon).Clone() as Icon;DestroyIcon(shfi.hIcon); //释放资源return icon;}/// <summary> /// 获取文件夹图标/// </summary> /// <returns>图标</returns> public static Icon GetDirectoryIcon(bool isLargeIcon){SHFILEINFO _SHFILEINFO = new SHFILEINFO();IntPtr _IconIntPtr;if (isLargeIcon){_IconIntPtr = SHGetFileInfo(@””,ref _SHFILEINFO,(uint)Marshal.SizeOf(_SHFILEINFO),((uint)FileInfoFlags.SHGFI_ICON | (uint)FileInfoFlags.SHGFI_LARGEICON));}else{_IconIntPtr = SHGetFileInfo(@””,((uint)FileInfoFlags.SHGFI_ICON | (uint)FileInfoFlags.SHGFI_SMALLICON));}if (_IconIntPtr.Equals(IntPtr.Zero)) return null;Icon _Icon = System.Drawing.Icon.FromHandle(_SHFILEINFO.hIcon);return _Icon;}}}