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日

相关文章

  • 浅谈.Net Core后端单元测试的实现

    在.Net Core后端开发中,单元测试是一种非常重要的测试方法,可以帮助我们快速发现代码中的问题,提高代码质量。本文将详细讲解.Net Core后端单元测试的实现,包括环境搭建、代码实现、示例说明等。 环境搭建 在开始实现.Net Core后端单元测试之前,我们需要先搭建好开发环境。具体来说,我们需要安装以下软件: Visual Studio 2019或更…

    C# 2023年5月16日
    00
  • C#控制台输出进度和百分比的实例代码

    下面我将为你提供“C#控制台输出进度和百分比的实例代码”的完整攻略。 1. 实现思路 在C#中,我们可以通过控制台输出一些信息来显示进度和百分比。一般情况下,我们需要用到以下几个关键步骤: 获取总的任务量 对任务进行遍历或者处理,并计算完成进度 输出进度和百分比信息 2. 实例代码1 下面我将演示一个简单的示例代码,其中我们通过遍历一个集合来计算进度和百分比…

    C# 2023年6月7日
    00
  • 如何利用C#正则表达式判断是否是有效的文件及文件夹路径

    C#中正则表达式可以用来匹配、搜索、替换字符串等操作,因此可以用来判断一个字符串是否符合文件或文件夹路径的格式。下面是利用C#正则表达式判断是否是有效的文件及文件夹路径的攻略。 一、正则表达式 下面是表示文件路径的正则表达式: ^[a-zA-Z]:\\[^*?"<>|]+\.[^*?"<>|]+$ 下面是表示文件夹…

    C# 2023年5月15日
    00
  • 那些年,我还在学习C# 学习笔记

    那些年,我还在学习C# 学习笔记是一份非常好的学习资料,它不仅记录了作者在学习C#过程中的所学所感,也为初学者提供了非常好的学习入门资料。在这里,我们详细讲解一下如何使用这份笔记作为学习C#的攻略。 了解C#语言 作为一门编程语言,要想运用自如,首先需要了解其语法和特性。那些年,我还在学习C# 学习笔记提供了非常精简的语言说明,包含了C#语言基本语法、数据类…

    C# 2023年5月31日
    00
  • Mono for Android 实现高效的导航(Effective Navigation)

    Mono for Android实现高效的导航(Effective Navigation) 什么是高效的导航? 在移动应用开发中,导航是必不可少的部分,它决定了用户访问和操作你的应用的方式。因此,我们需要考虑怎样才能提供高效的导航,让用户能够更加方便地使用我们的应用。 有几个关键点值得注意: 易于理解:用户应该能够清晰地了解他们正在浏览什么,以及如何进行下一…

    C# 2023年6月6日
    00
  • C# 生成随机数的代码

    下面是关于C#生成随机数的完整攻略: 1. C#中生成随机数的方法 C#中生成随机数可以使用System.Random类来实现。该类使用默认的种子值生成随机数,也可以指定种子值来生成不同的随机序列。常用的方法有Next()、NextDouble()和NextBytes(byte[] buffer)方法,具体用法如下: 1.1 Next()方法: Next()…

    C# 2023年5月31日
    00
  • C# 基于NAudio实现对Wav音频文件剪切(限PCM格式)

    下面是详细讲解如何使用C#和NAudio库来实现对Wav音频文件的剪切操作。 1. 准备工作 在开始之前,需要先准备好以下工作: 安装.NET开发环境(建议使用Visual Studio,下载地址:https://visualstudio.microsoft.com/zh-hans/downloads/); 安装NAudio库(可以使用NuGet进行安装,或…

    C# 2023年6月1日
    00
  • C#中字符串优化String.Intern、IsInterned详解

    C#中字符串优化String.Intern、IsInterned详解 什么是字符串优化 在 C# 中,字符串是不可变类型,每次对字符串进行操作时都会产生新的字符串对象。这就意味着如果我们频繁地对字符串进行操作,就会造成很多对象的额外开销。所以为了减少这种开销,我们需要对字符串进行优化。 字符串优化的方法有很多,其中一种方法是使用 String.Intern …

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