获取文件夹中的图标资源

实现效果:

  

知识运用:

  API函数SHGetFileInfo    //获取包含在可执行文件或Dll中的图标数或图标资源

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

  

  和ExtractIconEx函数      //从限定的可执行文件 动态链接库 或者图标文件中生成图标句柄数组

  [DllImport("shell32.dll")]
  public static extern uint ExtractIconEx(string lpszFile, int nIconIndex, int[] phiconLarge, int[] phiconSmall, uint nIcons);

  

实现代码:

        [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);
        [DllImport("shell32.dll")]
        public static extern uint ExtractIconEx(string lpszFile, int nIconIndex, int[] phiconLarge, int[] phiconSmall, uint nIcons);
        [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;
        }

        private void button2_Click(object sender, EventArgs e)
        {
            if (textBox1.Text.Length > 0)
                GetlistViewItem(textBox1.Text,imageList1,lv1);
        }

        public void GetlistViewItem(string path, ImageList imagelist, ListView lv)      //获取指定路径下的所有文件及其图标
        {
            lv.Items.Clear();
            SHFILEINFO shfi = new SHFILEINFO();                                         //创建SHFILEINFO对象
            try
            {
                string[] dirs = Directory.GetDirectories(path);                         //获取指定目录中子目录的名称
                string[] files = Directory.GetFiles(path);                              //获取指定路径中文件的名称
                for (int i = 0; i < dirs.Length; i++)                                   //遍历子文件夹
                {
                    string[] info = new string[4];                                      //定义一个数组
                    DirectoryInfo dir = new DirectoryInfo(dirs[i]);                     //根据文件夹路径创建DirectoryInfo对象
                    if (!(dir.Name == "RECYCLER" || dir.Name == "RECYCLED" || dir.Name == "Recycled" || dir.Name == "System Volume Infomation"))
                    {
                        //获取文件夹的图标及类型
                        SHGetFileInfo(dirs[i], (uint)0x80, ref shfi, (uint)System.Runtime.InteropServices.Marshal.SizeOf(shfi), (uint)(0x100 | 0x400));
                        imagelist.Images.Add(dir.Name, (Icon)Icon.FromHandle(shfi.hIcon).Clone());  //添加图标
                        info[0] = dir.Name;                                             //获取文件夹名称
                        info[1] = "";                                                   //获取文件夹大小
                        info[2] = "文件夹";                                             //获取类型
                        info[3] = dir.LastAccessTime.ToString();                        //获取修改时间
                        ListViewItem item = new ListViewItem(info,dir.Name);            //创建ListViewItem对象
                        lv.Items.Add(item);                                             //添加当前文件夹的基本信息
                        DestroyIcon(shfi.hIcon);                                        //销毁图标
                    }

                }
                for (int i = 0; i < files.Length; i++)                                  //遍历目录下的文件
                {
                    string[] info = new string[4];
                    FileInfo fi=new FileInfo(files[i]);
                    string Filetype=files[i].Substring(files[i].LastIndexOf(".")+1,files[i].Length-files[i].LastIndexOf(".")-1);
                    string Newtype=Filetype.ToString();
                    if (!(Newtype == "sys" || Newtype == "ini" || Newtype == "bin" || Newtype ==  "log" || Newtype == "com" || Newtype == "bat" || Newtype == "db"))
                    {
                        SHGetFileInfo(files[i], (uint)0x80, ref shfi, (uint)System.Runtime.InteropServices.Marshal.SizeOf(shfi), (uint)(0x100 | 0x400));
                        imagelist.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.LastAccessTime.ToString();
                        ListViewItem item = new ListViewItem(info, fi.Name);
                        lv.Items.Add(item);
                        DestroyIcon(shfi.hIcon);
                    }
                }
            }
            catch{}
        }

        private void button1_Click(object sender, EventArgs e)
        {
            if (folderBrowserDialog1.ShowDialog() == DialogResult.OK)
            {
                textBox1.Text = folderBrowserDialog1.SelectedPath;
            }
        }

  

原文地址:https://www.cnblogs.com/feiyucha/p/10230797.html

时间: 2024-11-05 21:40:13

获取文件夹中的图标资源的相关文章

C++获取文件夹中所有文件

获取文件夹中的文件,用到过很多次,每次用的时候都要去查下,很烦,所以想自己写下,当然,借鉴了很多其他大佬的博客 主要实现的函数,如下: 1 void getFiles( string path, vector<string>& files ) 2 { 3 //文件句柄 4 long hFile = 0; 5 //文件信息 6 struct _finddata_t fileinfo; 7 string p; 8 if((hFile = _findfirst(p.assign(path).

nodejs 获取文件夹中的文件和获取文件夹中的所有图片

//获取项目工程里的图片 var fs = require('fs');//引用文件系统模块 var image = require("imageinfo"); //引用imageinfo模块 function readFileList(path, filesList) { var files = fs.readdirSync(path); files.forEach(function (itm, index) { var stat = fs.statSync(path + itm);

iOS获取文件夹中存储空间的大小、手机剩余空间大小、手机总空间大小 工具

// // DiskSpaceTool.h // ScreenRecordMaster // // Created by feimo on 15/7/24. // Copyright (c) 2015年 feimo. All rights reserved. // #import <Foundation/Foundation.h> #include <sys/param.h> #include <sys/mount.h> @interface DiskSpaceTool

c#获取文件夹中指定类型的文件

//第一种方法 var files = Directory.GetFiles(path, "*.txt"); foreach (var file in files) Console.WriteLine(file); //第二种方法 DirectoryInfo folder = new DirectoryInfo(path); foreach (FileInfo file in folder.GetFiles("*.txt")) { Console.WriteLine

遍历文件夹中所有文件(C++)

想要实现对 文件夹 中 文件信息 的 查找与路径获取,需要用到 头文件 #include "io.h" 中的 一个结构体 和 三个函数 1. 结构体 struct _finddata_t 用来存储文件各种信息. struct _finddata_t { unsigned attrib;//文件的属性 time_t time_create;//文件的创建时间 time_t time_access;//文件最后一次被访问的时间 time_t time_write;//文件最后一次被修改的时

JavaSE 文件递归之删除&amp;amp;获取文件夹文件夹中全部的以.jpg的文件的绝对路径

1.递归删除文件 假设一个文件夹以下还有子文件夹,进行删除的话会 报错,这个时候要使用递归的方式来删除这个文件文件夹中的全部文件以及文件夹 package cn.itcast.digui; import java.io.File; /** * 递归删除demo目录中全部文件包含目录 * 分析: * A:封装目录 * B:获取改目录下的全部文件或者目录 * C:遍历改file数组,得到每个File对象 * D:推断该file对象是都是目录 * 是:回到B * 否:删除 * @author Admi

获取一个想要的指定文件的集合,获取文件夹下(包含子目录的所有.java的文件对象,并存储到集合中)

import java.io.File; import java.io.FileFilter; import java.io.ObjectInputStream.GetField; import java.util.ArrayList; import java.util.List; public class huoquwenjian { /*获取一个想要的指定文件的集合,获取文件夹下(包含子目录的所有.java的文件对象,并存储到集合中) * 思路: * 1,既然包含子目录,就需要递归. * 2

获取文件夹下所有文件(包括子文件)放在list&lt;File&gt;中

public static List<File> getAllFileList(File rootFile) { return getAllFileList(rootFile.getAbsolutePath(), null); } /** * 获取文件夹下所有文件(包括子文件) * * @param filePath * @param fileList * @return */ public static List<File> getAllFileList(String fileP

WPF获取读取电脑指定文件夹中的指定文件的地址

1 //保存指定文件夹中的指定文件的地址 2 3 string List<string> mListUri = new List<string>(); 4 5 //文件夹地址 6 7 string folderName = Environment.CurrentDirectory; 8 9 /// <summary> 10 /// 读取文件夹中指定文件 11 /// </summary> 12 public void LoadAllFile() 13 { 1