调用API函数取得文件图标和文件类型

本文介绍如何使用C#通过调用API函数获取文件图标和文件类型,并展示了具体的代码实现,包括使用SHGetFileInfo函数从指定路径获取文件信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

前段时间写了一个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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值