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日

相关文章

  • C# WCF简单入门图文教程(VS2010版)

    C# WCF简单入门图文教程(VS2010版) WCF(Windows Communication Foundation)是一个用于构建分布式应用程序的框架。它提供了一种统一的编程模型,使得开发人员可以使用不同的传输协议和编码方式来实现分布式应用程序。本文将详细讲解如何使用C# WCF进行简单入门,并提供两个示例。 1. 创建WCF服务 首先,我们需要创建一…

    C# 2023年5月15日
    00
  • C#运算符大全_各种运算符号的概述及作用

    C#运算符大全:各种运算符号的概述及作用 C#作为一种编程语言,有着相当多的运算符可以使用。这篇文章将为大家介绍C#中各种运算符号的概述及作用。 算术运算符 C#中的算术运算符包括 +、 -、 *、 /、 % 等。其中加(+)号可以用于字符串拼接。以下是一些算术运算符的示例: int a = 5; int b = 3; int c = a + b; // c…

    C# 2023年5月15日
    00
  • asp.net后台注册js的四种方法分享

    下面我将详细讲解asp.net后台注册js的四种方法,希望对你有所帮助。 1. 在aspx的头部使用script标签嵌入javascript代码 这种方法是比较简单的,直接在aspx页面的头部使用script标签嵌入javascript代码即可。示例如下: <head runat="server"> <script ty…

    C# 2023年5月31日
    00
  • .NET Visual Studio 代码性能分析工具

    . 什么是“.NET Visual Studio 代码性能分析工具”? “.NET Visual Studio 代码性能分析工具”是由微软公司推出的一款能够帮助开发人员分析和解决应用程序性能问题的工具。使用该工具,开发人员可以分析应用程序的全部或部分代码,识别性能瓶颈,并通过该工具提供的数据优化应用程序的性能。 . 如何使用“.NET Visual Stud…

    C# 2023年5月31日
    00
  • C# 在项目中引用x86 x64的非托管代码的方法

    使用 C# 项目引入 x86 x64 非托管代码的方法可以分为以下几步: 1. 创建 C# 项目 首先,需要创建一个 Visual Studio C# 项目,选择类型为“Class Library”。 2. 引入非托管 DLL 文件 在项目中添加 x86 和 x64 能够使用的非托管 DLL 文件,可以通过添加已存在的项目形式进行添加。 右键项目文件夹,在菜…

    C# 2023年6月6日
    00
  • IIS7 fastcgi方式安装php

    IIS7 fastcgi方式安装php IIS7是一种Web服务器,可以用于托管ASP.NET和PHP应用程序。在IIS7中,可以使用fastcgi方式来安装PHP。本文将提供详细的“IIS7 fastcgi方式安装php”的完整攻略,包括如何安装fastcgi和PHP,以及示例代码。 安装fastcgi 安装fastcgi需要以下步骤: 下载fastcgi…

    C# 2023年5月15日
    00
  • C#实现远程连接ORACLE数据库的方法

    下面将为您详细讲解C#实现远程连接ORACLE数据库的方法及过程。 准备工作 在使用C#实现远程连接ORACLE数据库之前,我们需要准备相应的环境和工具,包括: 安装ORACLE数据库 下载安装Oracle Client和ODP.NET 使用Visual Studio创建C#项目 连接ORACLE数据库 在开始连接ORACLE数据库之前,我们需要先在项目中添…

    C# 2023年6月2日
    00
  • 一篇文章彻底搞清楚c#中的委托与事件

    一篇文章彻底搞清楚C#中的委托与事件 委托 委托(Delegate)是一种类型,它可以持有函数的引用并执行这个函数。通过委托,我们可以在不知道函数名的情况下,直接访问和执行函数。 定义 在C#中,委托是定义在类的外部,但是要在类的内部定义具体的委托实例。委托的定义格式如下: public delegate void DelegateName(paramete…

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