C#中如何获取文件图标

获取文件图标是C#中经常用到的一个功能,本篇攻略将介绍如何使用C#从操作系统中获取文件图标。

获取文件图标的方法

在C#中,我们可以使用如下两种方法来获取文件图标:

1.使用Icon.ExtractAssociatedIcon方法

Icon.ExtractAssociatedIcon方法用于从指定文件的关联程序中提取出图标:

string filePath = @"C:\Windows\notepad.exe";
Icon icon = Icon.ExtractAssociatedIcon(filePath);

上述代码将从Windows计算机的C:\Windows目录中加载notepad.exe程序,并提取其关联图标。结果以Icon对象的形式返回,可以通过该对象获取图标的各种信息:大小、颜色深度等。

2.使用SHGetFileInfo方法

SHGetFileInfo方法是Win32API中的一个函数,其可以从操作系统中获取文件的各种属性,包括文件名、大小、图标等。在C#中,我们可以通过P/Invoke方式来调用该函数:

[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 int iIcon;
    public uint dwAttributes;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
    public string szDisplayName;
    [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
    public string szTypeName;
}

const uint SHGFI_ICON = 0x000000100;     // Get icon
const uint SHGFI_LARGEICON = 0x000000000;  // Get large icon
const uint SHGFI_SMALLICON = 0x000000001;  // Get small icon   

string filePath = @"C:\Windows\notepad.exe";
SHFILEINFO shfi = new SHFILEINFO();
IntPtr hIcon = SHGetFileInfo(filePath, 0, ref shfi, (uint)Marshal.SizeOf(shfi), SHGFI_ICON | SHGFI_LARGEICON);
Icon icon = Icon.FromHandle(shfi.hIcon);

上述代码利用了SHGetFileInfo函数中的SHFILEINFO结构体来获取文件的属性,其中hIcon成员变量即为文件的图标句柄,我们可以通过Icon.FromHandle方法将它转换为Icon对象。

示例说明

以下是两个获取文件图标的示例:

示例一:添加文件的图标到ListView控件中

string filePath = @"C:\Windows\notepad.exe";
Icon icon = Icon.ExtractAssociatedIcon(filePath);
imageList1.Images.Add(icon);
int index = imageList1.Images.Count - 1;
listView1.Items.Add(new ListViewItem("Notepad", index));

上述代码将从Windows计算机的C:\Windows目录中加载notepad.exe程序,并提取其关联图标。将获取到的图标添加到imageList1控件中,并将一个ListViewItem对象加入listView1控件中,该对象包含文件名和图标的索引值即可。

示例二:封装文件图标获取类

我们可以将获取文件图标的方法封装到一个类中,使得在其他地方使用更加方便。

class FileIcon
{
    [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 int iIcon;
        public uint dwAttributes;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 260)]
        public string szDisplayName;
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
        public string szTypeName;
    }

    const uint SHGFI_ICON = 0x000000100;
    const uint SHGFI_LARGEICON = 0x000000000;
    const uint SHGFI_SMALLICON = 0x000000001;

    public static Icon GetIcon(string filePath, bool largeIcon)
    {
        SHFILEINFO shfi = new SHFILEINFO();
        uint flags = SHGFI_ICON | (largeIcon ? SHGFI_LARGEICON : SHGFI_SMALLICON);
        IntPtr hIcon = SHGetFileInfo(filePath, 0, ref shfi, (uint)Marshal.SizeOf(shfi), flags);
        return Icon.FromHandle(shfi.hIcon);
    }
}

上述代码封装了获取文件图标的方法,并定义了一个GetIcon静态函数,调用该函数,即可根据指定的文件路径和图标大小类型获取对应文件的图标。如下为该函数的使用示例:

string filePath = @"C:\Windows\notepad.exe";
Icon iconLarge = FileIcon.GetIcon(filePath, true);
Icon iconSmall = FileIcon.GetIcon(filePath, false);
pictureBox1.Image = iconLarge.ToBitmap();
pictureBox2.Image = iconSmall.ToBitmap();

在上述示例中,通过调用FileIcon.GetIcon函数,获取到了计算机中C:\Windows\notepad.exe程序的大图标和小图标,并将它们显示在两个PictureBox控件中。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C#中如何获取文件图标 - Python技术站

(0)
上一篇 2023年6月1日
下一篇 2023年6月1日

相关文章

  • Winform中GridView分组排序功能实现方法

    下面是详细讲解“Winform中GridView分组排序功能实现方法”的完整攻略。 准备工作 在项目中添加 DataGridView 控件; 设置 DataGridView 的 DataSource 属性,使其绑定到数据源中。 实现分组功能 在 DataGridView 中,右键单击任意列的表头,选择“分组”,即可实现分组功能; 可以根据需求选择多个字段进行…

    C# 2023年5月31日
    00
  • C#操作EXCEL DataTable转换的实例代码

    我来讲一下“C#操作EXCEL DataTable转换的实例代码”的完整攻略。 什么是DataTable和Excel之间的转换? DataTable 是 .NET Framework 中的一个内置类型,用于存储内存中的数据。而 Excel 是一种电子表格,通常用于存储大量数据。由于 DataTable 和 Excel 都是用于存储数据的,因此我们可以在它们之…

    C# 2023年5月31日
    00
  • c# 读取Northwind数据库image字段

    读取Northwind数据库中的image字段,可以通过ADO.NET提供的SqlDataReader类或者DataSet类中的DataTable来完成。 以下是实现步骤: 步骤一:连接数据库 使用System.Data.SqlClient命名空间中的SqlConnection类连接Northwind数据库。 示例代码: using System.Data.…

    C# 2023年5月31日
    00
  • 深入分析缓存依赖中cachedependency对象及周边小讲

    深入分析缓存依赖中 Cachedependency 对象及周边小讲 什么是缓存依赖 缓存依赖是 ASP.NET 缓存技术中的一个概念,用于实现缓存与数据源的自动同步、自动更新。具体来说,缓存依赖是一种机制,当特定的条件成立时,会自动使缓存变得无效,以便下一次访问时可以从数据源重新获取数据。通过使用缓存依赖,我们可以避免缓存与数据源不一致的问题,提高应用程序的…

    C# 2023年6月1日
    00
  • C#调用EXE文件实现传参和获取返回结果

    首先,我们需要知道C#调用EXE文件实现传参和获取返回结果的基本流程。具体流程如下: 1.使用Process类启动外部EXE程序。 2.在ProcessStartInfo对象中设置使用的外部程序、参数和重定向标准输入输出等配置。 3.使用Process类的StandardInput属性向外部程序写入数据。 4.使用Process类的StandardOutpu…

    C# 2023年5月15日
    00
  • .Net Api 中使用Elasticsearch存储文档的方法

    下面我来详细讲解一下“.Net Api 中使用Elasticsearch存储文档的方法”的完整攻略。 步骤一:安装Elasticsearch与.NET Api 首先,我们需要在本地安装Elasticsearch和.NET Api。可以前往Elasticsearch官网下载对应操作系统的版本进行安装。同时,也可以在Visual Studio的Nuget包管理器…

    C# 2023年5月31日
    00
  • 详解ASP.NET中Identity的身份验证代码

    下面是详解ASP.NET中Identity的身份验证代码的攻略,包含代码示例和说明。 什么是Identity Identity是.NET Core中的一个授权和认证系统,用于管理用户和用户数据。使用Identity可以轻松地添加身份验证、身份验证和访问控制到应用程序中。 配置Identity 要使用Identity,需要在ASP.NET Core项目中添加I…

    C# 2023年5月31日
    00
  • c#的dllimport使用方法详解

    关于“C#的DllImport使用方法详解”的攻略如下: 简介 DllImport是C#中一个用于调用非托管代码的方法。它可以让我们在C#代码中调用一些使用一些C++或Win32 API等编写的代码。 使用方法 DllImport的用法非常简单,我们只需要使用指定DllImport特性来声明一个需要调用的函数,然后在代码中直接调用该函数即可。 下面是DllI…

    C# 2023年6月1日
    00
合作推广
合作推广
分享本页
返回顶部