前段时间写了一个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); //销毁图标
}把取得的文件图标和文件类型描述,放到一个以Detail方式显示的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
本文介绍如何使用C#通过调用API函数获取文件图标和文件类型,并展示了具体的代码实现,包括使用SHGetFileInfo函数从指定路径获取文件信息。
274

被折叠的 条评论
为什么被折叠?



