1.根据文件路径文件或文件夹图标获取 2.根据后缀获取系统图标
2012-12-11 11:42
513 查看
using System; using System.Collections.Generic; using System.Text; using System.Runtime.InteropServices; using System.Drawing; namespace CommonLibrary { /// <summary> /// 根据文件名称获取文件的系统图标 /// </summary> public static class IconUtilsByFilePath { [StructLayout(LayoutKind.Sequential)] public struct SHFILEINFO { public IntPtr hIcon; public IntPtr iIcon; public uint dwAttributes; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)] public string szDisplayName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)] public string szTypeName; } ///<summary> /// 返回系统设置的图标 ///</summary> ///<param name="pszPath">文件路径 如果为"" 返回文件夹的</param> ///<param name="dwFileAttributes">0</param> ///<param name="psfi">结构体</param> ///<param name="cbSizeFileInfo">结构体大小</param> ///<param name="uFlags">枚举类型</param> ///<returns>-1失败</returns> [DllImport("shell32.dll")] public static extern IntPtr SHGetFileInfo(string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbSizeFileInfo, uint uFlags); public enum SHGFI { SHGFI_ICON = 0x100, SHGFI_LARGEICON = 0x0, SHGFI_USEFILEATTRIBUTES = 0x10 } ///<summary> /// 获取文件图标 zgke@sina.com qq:116149 ///</summary> ///<param name="p_Path">文件全路径</param> ///<returns>图标</returns> public static Icon GetFileIcon(string p_Path) { SHFILEINFO _SHFILEINFO = new SHFILEINFO(); IntPtr _IconIntPtr = SHGetFileInfo(p_Path, 0, ref _SHFILEINFO, (uint)Marshal.SizeOf(_SHFILEINFO), (uint)(SHGFI.SHGFI_ICON | SHGFI.SHGFI_LARGEICON | SHGFI.SHGFI_USEFILEATTRIBUTES)); if (_IconIntPtr.Equals(IntPtr.Zero)) return null; Icon _Icon = System.Drawing.Icon.FromHandle(_SHFILEINFO.hIcon); return _Icon; } ///<summary> /// 获取文件夹图标 zgke@sina.com qq:116149 ///</summary> ///<returns>图标</returns> public static Icon GetDirectoryIcon() { SHFILEINFO _SHFILEINFO = new SHFILEINFO(); IntPtr _IconIntPtr = SHGetFileInfo(@"", 0, ref _SHFILEINFO, (uint)Marshal.SizeOf(_SHFILEINFO), (uint)(SHGFI.SHGFI_ICON | SHGFI.SHGFI_LARGEICON)); if (_IconIntPtr.Equals(IntPtr.Zero)) return null; Icon _Icon = System.Drawing.Icon.FromHandle(_SHFILEINFO.hIcon); return _Icon; } } /// <summary> /// 根据文件的后缀获取文件的系统图标 /// </summary> public static class IconUtilsByExtension { ///<summary> /// Used to access system folder icons. ///</summary> ///<param name="largeIcon">Specify large or small icons.</param> ///<param name="openFolder">Specify open or closed FolderType.</param> ///<returns>The requested Icon.</returns> public static Icon GetIconForFolder(Boolean largeIcon, Boolean openFolder) { SHFILEINFO shellFileInfo = new SHFILEINFO(); try { uint flags = SHGFI_ICON | SHGFI_USEFILEATTRIBUTES; flags |= openFolder ? SHGFI_OPENICON : 0; flags |= largeIcon ? SHGFI_LARGEICON : SHGFI_SMALLICON; SHGetFileInfo(null, FILE_ATTRIBUTE_DIRECTORY, ref shellFileInfo, (uint)Marshal.SizeOf(shellFileInfo), flags); return (Icon)Icon.FromHandle(shellFileInfo.hIcon).Clone(); } finally { DestroyIcon(shellFileInfo.hIcon); // Cleanup } } ///<summary> /// Used to access file icons for a given extension. ///</summary> ///<param name="extension">The file extension to get the icon for.</param> ///<param name="largeIcon">Specify large or small icons.</param> ///<param name="linkOverlay">Specify link overlay on the icon.</param> ///<returns>The requested Icon</returns> public static Icon GetIconForFileExtension(String extension, Boolean largeIcon, Boolean linkOverlay) { if (!extension.StartsWith(".")) extension = "." + extension; SHFILEINFO shellFileInfo = new SHFILEINFO(); try { uint flags = SHGFI_ICON | SHGFI_USEFILEATTRIBUTES; flags |= linkOverlay ? SHGFI_LINKOVERLAY : 0; flags |= largeIcon ? SHGFI_LARGEICON : SHGFI_SMALLICON; SHGetFileInfo(extension, FILE_ATTRIBUTE_NORMAL, ref shellFileInfo, (uint)Marshal.SizeOf(shellFileInfo), flags); return (Icon)Icon.FromHandle(shellFileInfo.hIcon).Clone(); } finally { DestroyIcon(shellFileInfo.hIcon); } } #region P/Invoke private const int MAX_PATH = 256; private const uint SHGFI_ICON = 0x000000100; private const uint SHGFI_LINKOVERLAY = 0x000008000; private const uint SHGFI_LARGEICON = 0x000000000; private const uint SHGFI_SMALLICON = 0x000000001; private const uint SHGFI_OPENICON = 0x000000002; private const uint SHGFI_USEFILEATTRIBUTES = 0x000000010; private const uint FILE_ATTRIBUTE_DIRECTORY = 0x00000010; private const uint FILE_ATTRIBUTE_NORMAL = 0x00000080; [StructLayout(LayoutKind.Sequential)] private struct SHFILEINFO { public const int NAMESIZE = 80; public IntPtr hIcon; public int iIcon; public uint dwAttributes; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = MAX_PATH)] public string szDisplayName; [MarshalAs(UnmanagedType.ByValTStr, SizeConst = NAMESIZE)] public string szTypeName; }; [DllImport("Shell32.dll")] private static extern IntPtr SHGetFileInfo( string pszPath, uint dwFileAttributes, ref SHFILEINFO psfi, uint cbFileInfo, uint uFlags ); [DllImport("User32.dll")] private static extern int DestroyIcon(IntPtr hIcon); #endregion } }
相关文章推荐
- Qt5获取系统文件图标,文件路径
- 算法积累:解决如何获取指定文件夹路径或者文件路径下所有子文件后缀为.h .m .c的文本的行数
- C# 根据绝对路径获取 带后缀文件名、后缀名、文件名、不带文件名的文件路径
- QT QString根据路径获取文件名称以及所在文件夹等信息
- C#获取系统文件、文件夹和磁盘驱动器图标
- Android4.4以上系统根据Uri正确获取文件路径的方法
- 算法积累:解决如何获取指定文件夹路径或者文件路径下所有子文件后缀为.h .m .c的文本的行数
- Android 根据路径获取该目录下的所有的 "文件夹",或者文件 判断的演变
- C#Winform开发,Listview根据文件路径或扩展名显示系统文件图标
- 【.Net】C# 根据绝对路径获取 带后缀文件名、后缀名、文件名、不带文件名的文件路径
- C#Winform开发,Listview根据文件路径或扩展名显示系统文件图标
- C#获取系统文件、文件夹和磁盘驱动器图标
- C#根据文件路径获取该文件夹路径、文件名、后缀名
- 根据路径获取文件夹下的所有文件路径
- java 使用递归获取指定文件路径目录,删除指定的文件后缀(可扩展,根据具体需要的删除的后缀进行配置)~~
- 获取系统文件文件夹图标之计算机图标(我的电脑图标)、驱动器图标文件图标等
- 根据文件扩展名获取系统图标
- 根据文件路径获得其所在文件夹,并删除该文件夹下后缀名为.tmp的所有文件
- C++根据文件路径获取文件名