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#中使用UDP通信实例

    以下是使用C#编写UDP通信示例的完整攻略: 1. 确定通信协议 使用UDP通信的前提是确定使用的通信协议,通信协议包括IP协议和UDP协议。在使用UDP协议时,需要选择一个端口号。一般来说,端口号从1024开始,最大是65535。在选择端口号时,应该选择一个不被其他程序占用的端口号。 2. 创建UDP类 在C#中,可以使用UdpClient类来创建UDP通…

    C# 2023年6月6日
    00
  • C#封装的常用文件操作类实例

    C#封装的常用文件操作类实例 在C#语言中,常见的文件操作有:文件创建、写入、读取、删除、复制、移动等。这些操作都可以封装成类进行更方便的使用。本篇文章将讲解如何封装常用文件操作类,并且提供两个示例进行演示。 文件操作类的封装 C#中的文件操作类主要有File和Directory两个类。其中File类提供了文件的创建、写入、读取、删除等基本操作。Direct…

    C# 2023年5月15日
    00
  • C#并发容器之ConcurrentDictionary与普通Dictionary带锁性能详解

    C#并发容器之ConcurrentDictionary与普通Dictionary带锁性能详解 引言 在多线程编程中,确保线程安全是至关重要的。在实现线程安全的过程中,我们可以使用锁、互斥量等同步机制。而在 .NET Framework 4 中,引入了一些并发容器,例如ConcurrentDictionary,可以帮助我们更方便地实现线程安全。那么,在使用Co…

    C# 2023年6月1日
    00
  • C#实现发送简单HTTP请求的方法

    下面是详细讲解” C#实现发送简单HTTP请求的方法” 的完整攻略。 什么是HTTP请求 HTTP (Hypertext Transfer Protocol) 是应用最为广泛的一种网络通信协议. 在 Web 上, 当浏览器需要获取服务器的网页或其他资源时, 就会发送 HTTP 请求. Web 服务器则依照我们在 HTTP 请求消息中指定的内容进行相应处理, …

    C# 2023年6月1日
    00
  • C#实现简单串口通信

    为了实现串口通信,首先需要掌握C#中的串口通信相关类和方法。常用的类有SerialPort和SerialDataReceivedEventArgs,常用的方法有Open和Write等。下面分步骤讲解实现串口通信的完整攻略。 1. 新建C#控制台应用程序 首先,打开Visual Studio,新建一个C#控制台应用程序。选择“新建项目”–>“Visua…

    C# 2023年6月7日
    00
  • ASP.NET Core设置Ocelot网关限流

    ASP.NET Core设置Ocelot网关限流 Ocelot是一个基于.NET Core的API网关,它可以帮助我们将多个微服务组合成一个整体的API。在实际应用中,我们可能需要对API网关进行限流,以保证系统的稳定性和可靠性。本攻略将详细介绍如何在ASP.NET Core中使用Ocelot实现API网关限流。 安装Ocelot 首先,我们需要安装Ocel…

    C# 2023年5月17日
    00
  • C#如何防止程序多次运行的技巧

    C#如何防止程序多次运行的技巧有多种,下面我们将介绍两种实现方法。 方法一:利用文件锁 利用文件锁是一种简单有效的防止程序多次运行的技巧。具体实现方法如下: 首先在程序的入口处创建一个文件,例如使用FileStream类创建一个空的文件,命名为lockfile: using System.IO; // … FileStream fs = new File…

    C# 2023年5月15日
    00
  • C#获取哈希加密生成随机安全码的类实例

    获取哈希加密生成随机安全码的类实例,可以使用C#的内置类库System.Security.Cryptography中的类MD5、SHA1、SHA256等类。以下是详细的攻略流程: 1.导入System.Security.Cryptography命名空间 在C#中使用加密算法需要导入System.Security.Cryptography命名空间。首先在代码中…

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