-
取得文件图标和文件类型 - [Programming]
2007-01-19 | Tag:C# API
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://thjl.blogbus.com/logs/5218051.html
最近在写一个C#的文件更名工具,在写文件浏览时,需要获得文件的图标和文件类型。.NET框架中并没有现成的方法,只好调用API函数。
以下是调用API的类,取名为Win32
using System;
using System.Runtime.InteropServices;namespace Renamer
{
class Win32
{
//调用API
[DllImport("Shell32.dll")]
public static extern int ExtractIcon(IntPtr hInst, String lpszExeFileName, int nIndex);[DllImport("Shell32.dll")]
public static extern IntPtr SHGetFileInfo(
string pszPath,
uint dwFileAttributes,
ref SHFILEINFO psfi,
uint cbSizeFileInfo,
uint uFlags);[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;
};[DllImport("User32.dll")]
public static extern int DestroyIcon(IntPtr hIcon);
}
}下面是调用方法的代码:
String[] fls = Directory.GetFiles(@path);
foreach (String filename in fls)
{
String[] lvItem = new string[3];
FileInfo fi = new FileInfo(filename);
//取得文件图标
Win32.SHGetFileInfo(
filename,
(uint)0x80,
ref shfi,
(uint)System.Runtime.InteropServices.Marshal.SizeOf(shfi),
(uint)(0x100 | 0x400) //取得Icon和TypeName
);
//添加图标
FileIcons.Images.Add(fi.Name, (Icon)Icon.FromHandle(shfi.hIcon).Clone());lvItem[0] = fi.Name;
lvItem[1] = shfi.szTypeName;
ListViewItem lvFile = new ListViewItem(lvItem, fi.Name);
listView1.Items.Add(lvFile);
Win32.DestroyIcon(shfi.hIcon); //销毁图标把取得的文件图标和文件类型描述,放到一个祥细方式显示的ListView中,FileIcons是一个和listView1的SmallImageList相关联的ImageList。
SHGetFileInfo的 uFlags参数是由一些16进制常数来表示的,需要重叠时,只要位或('|')便可。可以直接用16进制数,也可以在WIN32类中自定义一个常数枚举。uFlags常数:
SHGFI_ICON = 0x000000100,
SHGFI_DISPLAYNAME = 0x000000200,
SHGFI_TYPENAME = 0x000000400,
SHGFI_ATTRIBUTES = 0x000000800,
SHGFI_ICONLOCATION = 0x000001000,
SHGFI_EXETYPE = 0x000002000,
SHGFI_SYSICONINDEX = 0x000004000,
SHGFI_LINKOVERLAY = 0x000008000,
SHGFI_SELECTED = 0x000010000,
SHGFI_ATTR_SPECIFIED = 0x000020000,
SHGFI_LARGEICON = 0x000000000,
SHGFI_SMALLICON = 0x000000001,
SHGFI_OPENICON = 0x000000002,
SHGFI_SHELLICONSIZE = 0x000000004,
SHGFI_PIDL = 0x000000008,
SHGFI_USEFILEATTRIBUTES = 0x000000010
收藏到:Del.icio.us
引用地址:







