根据文件名或文件扩展名获取文件的默认图标


新建一个vs2010 窗体项目,新建按钮button和图片picturebox 下面是程序

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Runtime.InteropServices;

namespace findIconWithPathFile
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

string xx = null;
private void button1_Click(object sender, EventArgs e)
{
if (string.IsNullOrWhiteSpace(xx) == true)
{
using (OpenFileDialog dlg = new OpenFileDialog())
{
dlg.CheckFileExists = true;
dlg.CheckPathExists = true;
dlg.Filter = "所有文件(*.*)|*.*";
if (dlg.ShowDialog(this) == System.Windows.Forms.DialogResult.OK)
{
xx = dlg.FileName;
}
}
//Icon icon= getIcon(xx ,true);
Icon icon = getIcon1(xx);
pictureBox1.Image = icon.ToBitmap();
}
}

[DllImport("shell32.dll")]
public extern static uint ExtractIconEx(string lpszFile, int nIconIndex, int[] phiconLarge, int[] phiconSmall, uint nIcons);

public Icon getIcon(string pathxx, bool large)
{
int[] phiconLarge = new int[1];
int[] phiconSmall = new int[1];
ExtractIconEx(pathxx, 0, phiconLarge, phiconSmall, 1);
IntPtr handle = new IntPtr(large ? phiconLarge[0] : phiconSmall[0]);
Icon icon = Icon.FromHandle(handle);

return icon;
}

public Icon getIcon1(string pathxx)
{

Icon image=Icon.ExtractAssociatedIcon(Filepath).ToBitmap();//转换一下

Icon icon = Icon.ExtractAssociatedIcon(pathxx);

return icon;
}
}
}

根据不同的文件扩展名显示不同的图标,在C#中可以使用 Icon icon = System.Drawing.Icon.ExtractAssociatedIcon(fileFullName) 来得到指定文件图标。 ///<summary>
///依据文件名读取图标,若指定文件不存在,则返回空值。
///</summary>
///<paramname="fileName">文件路径</param>
///<paramname="isLarge">是否返回大图标</param>
///<returns></returns>
publicstaticIconGetIconByFileName(stringfileName,boolisLarge=true)
{
int[]phiconLarge=newint[1];
int[]phiconSmall=newint[1];
//文件名图标索引
try
{
Win32.ExtractIconEx(fileName,0,phiconLarge,phiconSmall,1);
IntPtrIconHnd=newIntPtr(isLarge?phiconLarge[0]:phiconSmall[0]);
returnIcon.FromHandle(IconHnd);
}
catch{
returnnull;
}
} ///<summary>
///根据文件扩展名(如:.*),返回与之关联的图标。
///若不以"."开头则返回文件夹的图标。
///</summary>
///<paramname="fileType">文件扩展名</param>
///<paramname="isLarge">是否返回大图标</param>
///<returns></returns>
publicstaticIconGetIconByFileType(stringfileType,boolisLarge)
{
if(fileType==null||fileType.Equals(string.Empty))returnnull;

RegistryKeyregVersion=null;
stringregFileType=null;
stringregIconString=null;
stringsystemDirectory=Environment.SystemDirectory+"\\";

if(fileType[0]=='.')
{
//读系统注册表中文件类型信息
regVersion=Registry.ClassesRoot.OpenSubKey(fileType,true);
if(regVersion!=null)
{
regFileType=regVersion.GetValue("")asstring;
regVersion.Close();
regVersion=Registry.ClassesRoot.OpenSubKey(regFileType+@"\DefaultIcon",true);
if(regVersion!=null)
{
regIconString=regVersion.GetValue("")asstring;
regVersion.Close();
}
}
if(regIconString==null)
{
//没有读取到文件类型注册信息,指定为未知文件类型的图标
regIconString=systemDirectory+"shell32.dll,0";
}
}
else
{
//直接指定为文件夹图标
regIconString=systemDirectory+"shell32.dll,3";
}
string[]fileIcon=regIconString.Split(newchar[]{','});
if(fileIcon.Length!=2)
{
//系统注册表中注册的标图不能直接提取,则返回可执行文件的通用图标
fileIcon=newstring[]{systemDirectory+"shell32.dll","2"};
}
IconresultIcon=null;
try
{
//调用API方法读取图标
int[]phiconLarge=newint[1];
int[]phiconSmall=newint[1];
uintcount=Win32.ExtractIconEx(fileIcon[0],Int32.Parse(fileIcon[1]),phiconLarge,phiconSmall,1);
IntPtrIconHnd=newIntPtr(isLarge?phiconLarge[0]:phiconSmall[0]);
resultIcon=Icon.FromHandle(IconHnd);
}
catch{}
returnresultIcon;
}
} 虽然在C#中可以使用 Icon icon = System.Drawing.Icon.ExtractAssociatedIcon(fileFullName) 来得到指定文件图标。但是Icon.ExtractAssociatedIcon 只能获取大图标,要获取小图标还是要使用 API。

usingSystem;
usingSystem.Runtime.InteropServices;
usingSystem.Drawing;

namespaceMyNamespace
{
publicclassFileIcon
{
///<summary>
///获取文件的默认图标
///</summary>
///<paramname="fileName">文件名。
///可以只是文件名,甚至只是文件的扩展名(.*);
///如果想获得.ICO文件所表示的图标,则必须是文件的完整路径。
///</param>
///<paramname="largeIcon">是否大图标</param>
///<returns>文件的默认图标</returns>
publicstaticIconGetFileIcon(stringfileName,boollargeIcon)
{
SHFILEINFOinfo=newSHFILEINFO(true);
intcbFileInfo=Marshal.SizeOf(info);
SHGFIflags;
if(largeIcon)
flags=SHGFI.Icon|SHGFI.LargeIcon|SHGFI.UseFileAttributes;
else
flags=SHGFI.Icon|SHGFI.SmallIcon|SHGFI.UseFileAttributes;

SHGetFileInfo(fileName,256,outinfo,(uint)cbFileInfo,flags);
returnIcon.FromHandle(info.hIcon);
}

[DllImport("Shell32.dll")]
privatestaticexternintSHGetFileInfo
(
stringpszPath,
uintdwFileAttributes,
outSHFILEINFOpsfi,
uintcbfileInfo,
SHGFIuFlags
);

[StructLayout(LayoutKind.Sequential)]
privatestructSHFILEINFO
{
publicSHFILEINFO(boolb)
{
hIcon=IntPtr.Zero;iIcon=0;dwAttributes=0;szDisplayName="";szTypeName="";
}
publicIntPtrhIcon;
publicintiIcon;
publicuintdwAttributes;
[MarshalAs(UnmanagedType.LPStr,SizeConst=260)]
publicstringszDisplayName;
[MarshalAs(UnmanagedType.LPStr,SizeConst=80)]
publicstringszTypeName;
};

privateenumSHGFI
{
SmallIcon=0x00000001,
LargeIcon=0x00000000,
Icon=0x00000100,
DisplayName=0x00000200,
Typename=0x00000400,
SysIconIndex=0x00004000,
UseFileAttributes=0x00000010
}
}
}

优质内容筛选与推荐>>
1、od源代码
2、模拟器输入
3、将查询结果赋值给文本框注意事项
4、jquery mobile使用时dialog样式不稳定的解决方法
5、15日期、时间函数


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号