C#中如何获取文件图标
本文给大家介绍如何去获取一个文件的关联图标呢?现总结如下:
首先明确问题:获取一个文件的关联图标或者是某个类型文件的显示图标。
在网上搜了一圈,发现方法还是比较多的,但是应用C#进行获取的方法不多。我选择一种用.Net库的方法。
使用的类:
System.Drawing.Icon,位于System.Drawing命名空间。
具体方法:
System.Drawing.Icon类中的静态方法:publicstaticIconExtractAssociatedIcon(stringfilePath)
此方法接收一个文件路径,返回一个Icon类型的对象。此对象既是指定文件的Icon图标对象。
此Icon类提供了Save方法,可以将Icon文件写入流中,进而保存至硬盘文件。
当然要在程序中显示也是可以的,Icon类提供了ToBitmap方法,可以将Icon文件转换为Bitmap。Bitmap就可以在PictureBox中显示了。
如果要根据后缀名来获取文件图标,那要怎么办呢?我想了一个比较笨的办法。看代码~
stringfileName="tmp."+houzhuiming; File.Create(fileName).Close(); Imageimg=System.Drawing.Icon.ExtractAssociatedIcon(fileName).ToBitmap(); File.Delete(fileName);
如此,新建一个指定后缀名的文件,获取图标后直接删除,就能获得指定文件后缀名的图标了。嘻嘻~
下面给大家分享一段代码介绍C#获取文件关联图标
usingSystem; usingSystem.Collections.Generic; usingSystem.Text; usingSystem.Runtime.InteropServices; usingSystem.Drawing; usingMicrosoft.Win32; namespaceifmdp.DeviceManager { classSystemIcon { [StructLayout(LayoutKind.Sequential,CharSet=CharSet.Auto)] publicstructSHFILEINFO { publicIntPtrhIcon; publicintiIcon; publicuintdwAttributes; [MarshalAs(UnmanagedType.ByValTStr,SizeConst=260)] publicstringszDisplayName; [MarshalAs(UnmanagedType.ByValTStr,SizeConst=80)] publicstringszTypeName; } [DllImport("Shell32.dll",EntryPoint="SHGetFileInfo",SetLastError=true,CharSet=CharSet.Auto)] publicstaticexternIntPtrSHGetFileInfo(stringpszPath,uintdwFileAttributes,refSHFILEINFOpsfi,uintcbFileInfo,uintuFlags); [DllImport("User32.dll",EntryPoint="DestroyIcon")] publicstaticexternintDestroyIcon(IntPtrhIcon); #regionAPI参数的常量定义 publicenumFileInfoFlags:uint { SHGFI_ICON=0x000000100,//geticon SHGFI_DISPLAYNAME=0x000000200,//getdisplayname SHGFI_TYPENAME=0x000000400,//gettypename SHGFI_ATTRIBUTES=0x000000800,//getattributes SHGFI_ICONLOCATION=0x000001000,//geticonlocation SHGFI_EXETYPE=0x000002000,//returnexetype SHGFI_SYSICONINDEX=0x000004000,//getsystemiconindex SHGFI_LINKOVERLAY=0x000008000,//putalinkoverlayonicon SHGFI_SELECTED=0x000010000,//showiconinselectedstate SHGFI_ATTR_SPECIFIED=0x000020000,//getonlyspecifiedattributes SHGFI_LARGEICON=0x000000000,//getlargeicon SHGFI_SMALLICON=0x000000001,//getsmallicon SHGFI_OPENICON=0x000000002,//getopenicon SHGFI_SHELLICONSIZE=0x000000004,//getshellsizeicon SHGFI_PIDL=0x000000008,//pszPathisapidl SHGFI_USEFILEATTRIBUTES=0x000000010,//usepasseddwFileAttribute SHGFI_ADDOVERLAYS=0x000000020,//applytheappropriateoverlays SHGFI_OVERLAYINDEX=0x000000040//Gettheindexoftheoverlay } publicenumFileAttributeFlags: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> ///<paramname="fileName">文件类型的扩展名或文件的绝对路径</param> ///<paramname="isLargeIcon">是否返回大图标</param> ///<returns>获取到的图标</returns> publicstaticIconGetIcon(stringfileName,boolisLargeIcon) { SHFILEINFOshfi=newSHFILEINFO(); IntPtrhI; if(isLargeIcon) hI=SHGetFileInfo(fileName,0,refshfi,(uint)Marshal.SizeOf(shfi),(uint)FileInfoFlags.SHGFI_ICON|(uint)FileInfoFlags.SHGFI_USEFILEATTRIBUTES|(uint)FileInfoFlags.SHGFI_LARGEICON); else hI=SHGetFileInfo(fileName,0,refshfi,(uint)Marshal.SizeOf(shfi),(uint)FileInfoFlags.SHGFI_ICON|(uint)FileInfoFlags.SHGFI_USEFILEATTRIBUTES|(uint)FileInfoFlags.SHGFI_SMALLICON); Iconicon=Icon.FromHandle(shfi.hIcon).Clone()asIcon; DestroyIcon(shfi.hIcon);//释放资源 returnicon; } ///<summary> ///获取文件夹图标 ///</summary> ///<returns>图标</returns> publicstaticIconGetDirectoryIcon(boolisLargeIcon) { SHFILEINFO_SHFILEINFO=newSHFILEINFO(); IntPtr_IconIntPtr; if(isLargeIcon) { _IconIntPtr=SHGetFileInfo(@"",0,ref_SHFILEINFO,(uint)Marshal.SizeOf(_SHFILEINFO),((uint)FileInfoFlags.SHGFI_ICON|(uint)FileInfoFlags.SHGFI_LARGEICON)); } else { _IconIntPtr=SHGetFileInfo(@"",0,ref_SHFILEINFO,(uint)Marshal.SizeOf(_SHFILEINFO),((uint)FileInfoFlags.SHGFI_ICON|(uint)FileInfoFlags.SHGFI_SMALLICON)); } if(_IconIntPtr.Equals(IntPtr.Zero))returnnull; Icon_Icon=System.Drawing.Icon.FromHandle(_SHFILEINFO.hIcon); return_Icon; } } }