zoukankan      html  css  js  c++  java
  • 【转】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

  • 相关阅读:
    java设计模式----工厂模式
    使用.Net Core Mvc +SqlSugar +Autofac+AutoMapper+....
    使用 Date 和 SimpleDateFormat 类表示时间
    .Net Core 3.0 IdentityServer4 快速入门02
    .Net Core 3.0 IdentityServer4 快速入门
    微信小程序支付
    微信小程序集成腾讯云 IM SDK
    架构杂谈《十》
    架构杂谈《九》
    架构杂谈《八》
  • 原文地址:https://www.cnblogs.com/hetonghai/p/1208033.html
Copyright © 2011-2022 走看看