• 【转】C#获取文件与文件夹默认图标


     
    转自小李技术之家:http://blog.csdn.net/webajax/archive/2008/01/28/2070038.aspx

    最近在写一个媒体管理的服务器程序。里面要用到了一个获得指定文件的集成图标的。所以就写了一个用C#中调用API来获得指定文件的图标的代码,代码如下:

    导入API的类:

    using System;
    using System.Runtime.InteropServices;

    namespace MediaClient
    {
        
    public class Win32
        
    {
            [DllImport(
    "shell32.dll", EntryPoint = "ExtractIcon")]
            
    public static extern int ExtractIcon(IntPtr hInst,string lpFileName,int nIndex);

            [DllImport(
    "shell32.dll", EntryPoint = "SHGetFileInfo")]
            
    public static extern IntPtr SHGetFileInfo(string pszPath,uint dwFileAttribute,ref SHFILEINFO psfi,uint cbSizeFileInfo,uint Flags);

            [DllImport(
    "User32.dll", EntryPoint = "DestroyIcon")]
            
    public static extern int DestroyIcon(IntPtr hIcon);

            [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;
            }
    ;
        }

    }

    调用方法:

     /// <summary>
            
    /// 获得指定路径下面的所有文件及文件夹
            
    /// </summary>
            
    /// <param name="path">路径</param>
            
    /// <returns></returns>

            public ArrayList GetListViewItem(string path,ImageList imglist)
            
    {
                Win32.SHFILEINFO shfi 
    = new Win32.SHFILEINFO();
                
    try
                
    {
                    
    string[] dirs = Directory.GetDirectories(path);
                    
    string[] files = Directory.GetFiles(path);
                    ArrayList itemarr 
    = new ArrayList();

                    
    for (int i = 0; i < dirs.Length; i++)
                    
    {
                        
    string[] info = new string[4];
                        DirectoryInfo dir 
    = new DirectoryInfo(dirs[i]);
                        
    //获得图标
                        Win32.SHGetFileInfo(dirs[i], 
                                            (
    uint)0x80
                                            
    ref shfi, 
                                            (
    uint)System.Runtime.InteropServices.Marshal.SizeOf(shfi),
                                            (
    uint)(0x100 | 0x400)); //取得Icon和TypeName
                        
    //添加图标
                        imglist.Images.Add(dir.Name, (Icon)Icon.FromHandle(shfi.hIcon).Clone());
                        info[
    0= dir.Name;
                        info[
    1= "";
                        info[
    2= "文件夹";
                        info[
    3= dir.LastWriteTime.ToString();
                        ListViewItem item 
    = new ListViewItem(info,dir.Name);
                        itemarr.Add(item);
                        
    //销毁图标
                        Win32.DestroyIcon(shfi.hIcon);
                    }

                    
    for (int i = 0; i < files.Length; i++)
                    
    {
                        
    string[] info = new string[4];
                        FileInfo fi 
    = new FileInfo(files[i]);
                        
    //获得图标
                        Win32.SHGetFileInfo(files[i], 
                                            (
    uint)0x80
                                            
    ref shfi, 
                                            (
    uint)System.Runtime.InteropServices.Marshal.SizeOf(shfi),
                                            (
    uint)(0x100 | 0x400)); //取得Icon和TypeName
                        
    //添加图标
                        imglist.Images.Add(fi.Name,(Icon)Icon.FromHandle(shfi.hIcon).Clone());
                        info[
    0= fi.Name;
                        info[
    1= fi.Length.ToString();
                        info[
    2= fi.Extension.ToString();
                        info[
    3= fi.LastWriteTime.ToString();
                        ListViewItem item 
    = new ListViewItem(info,fi.Name);
                        itemarr.Add(item);
                        
    //销毁图标
                        Win32.DestroyIcon(shfi.hIcon);
                    }

                    
    return itemarr;
                    
                }

                
    catch
                
    {
                    
    return null;
                }

            }

    uFlags常数:
      SHGFI_ICON                                   =   0x100   
      SHGFI_DISPLAYNAME                   =   0x200,            
      SHGFI_TYPENAME                        =   0x400,          
      SHGFI_ATTRIBUTES                     =   0x800,        
      SHGFI_ICONLOCATION                 =   0x1000,            
      SHGFI_EXETYPE                           =   0x2000,            
      SHGFI_SYSICONINDEX                 =   0x4000,          
      SHGFI_LINKOVERLAY                  =   0x8000,            
      SHGFI_SELECTED                        =   0x10000,            
      SHGFI_ATTR_SPECIFIED             =   0x20000,            
      SHGFI_LARGEICON                      =   0x0,            
      SHGFI_SMALLICON                     =   0x1,            
      SHGFI_OPENICON                        =   0x2,            
      SHGFI_SHELLICONSIZE              =   0x4,            
      SHGFI_PIDL                                 =   0x8,            
      SHGFI_USEFILEATTRIBUTES      =   0x10

  • 相关阅读:
    颜色代码 #000~#FFF & DML案例设计
    SQLScript DML 创建 & 查询 & 序列(条件查询 日起查询 关联查询 子查询 分组查询 查询内容拼接 模糊查询)
    Java JDBC 连接数据库 Demo
    document的JavaScript一些用法
    dxSpreadSheet的报表demo-关于设计报表模板问题
    dxSpreadSheet的报表demo-关于设计报表模板的Datagroup问题
    TJSON的烦人的泄漏
    dxSpreadSheet的报表
    TDXSpreadSheet中自定义公式函数三大步骤
    SVN项目监视器的配置文件
  • 原文地址:https://www.cnblogs.com/hetonghai/p/1208033.html
Copyright © 2020-2023  润新知