• 取得文件图标和文件类型 - [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




    引用地址: