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;
}
}
}