C# 如何设置文件夹图标?

问题描述 投票:0回答:4

我使用 FilePathDialog.SelectedPath 获取文件夹的路径 我也知道图标的路径 但我不知道如何设置该文件夹的图标

c# icons
4个回答
4
投票

设置一些文件属性似乎很重要。

基于 https://github.com/dimuththarindu/FIC-Folder-Icon-Changer 这是精简版本。

在要设置其属性的文件夹中,创建三个文件:

  • MyIcon.ico

  • 您要显示的图标。您可以使用不同的文件名。

  • desktop.ini - 包含以下文本

    [.ShellClassInfo]

    IconResource=MyIcon.ico,0

    [视图状态]

    模式=

    视频=

    文件夹类型=通用

  • .hidden- 包含以下文字

    桌面.ini

    MyIcon.ico

我的文件类型是带有 BOM 的 UTF-8。

然后您需要将所有三个文件的属性设置为

  • 隐藏

  • 只读

最后,你需要通知系统发生了变化

SHChangeNotify(0x08000000, 0x0000, (IntPtr)null, (IntPtr)null);

假设您创建了一个 Visual Studio 解决方案,其中包含一个名为 Resources 的文件夹,其中包含三个文件,以下是设置图标的代码:

using System;
using System.IO;
using System.Runtime.InteropServices;

namespace SetFolderIcon
{
    class Program
    {
        [DllImport("shell32.dll", CharSet = CharSet.Auto, SetLastError = true)]
        private static extern void SHChangeNotify(
            int wEventId, int uFlags, IntPtr dwItem1, IntPtr dwItem2);

        static void Main(string[] args)
        {
            string location = $"C:\\Users\\Balint\\Desktop";
            string folderPath = Path.Combine(location, "My Folder");

            string desktopIniPath = Path.Combine(folderPath, "desktop.ini");
            string iconPath = Path.Combine(folderPath, "MyIcon.ico");
            string hiddenPath = Path.Combine(folderPath, ".hidden");

            Directory.CreateDirectory(folderPath);

            File.Copy($"Resources\\desktop.ini", desktopIniPath);
            File.Copy($"Resources\\Klinng.ico", iconPath);
            File.Copy($"Resources\\.hidden", hiddenPath);

            File.SetAttributes(desktopIniPath,
                File.GetAttributes(desktopIniPath)
                | FileAttributes.Hidden
                | FileAttributes.ReadOnly);
            File.SetAttributes(iconPath,
                File.GetAttributes(iconPath)
                | FileAttributes.Hidden
                | FileAttributes.ReadOnly);
            File.SetAttributes(hiddenPath,
                File.GetAttributes(hiddenPath)
                | FileAttributes.Hidden
                | FileAttributes.ReadOnly);
            File.SetAttributes(folderPath,
                File.GetAttributes(folderPath)
                | FileAttributes.ReadOnly);

            SHChangeNotify(0x08000000, 0x0000, (IntPtr)null, (IntPtr)null);
        }
    }
}

3
投票

您必须编写

desktop.ini
文件。

[.ShellClassInfo]
IconResource=Icon.ico,0
IconFile=Icon.ico
IconIndex=0
[ViewState]
Mode=
Vid=
FolderType=Pictures

C#代码

string dir = "Folder Path";   
string[] lines = { "[.ShellClassInfo]", "IconResource=Icon.ico,0", "[ViewState]", "Mode=", "Vid=", "FolderType=Pictures" };
File.WriteAllLines(dir + @"\desktop.ini", lines);

图标资源:{图标路径},0
文件夹类型:

Generic
Documents
Pictures
Music
Videos

如果您需要更多信息,请查看此 GitHub 项目:https://github.com/FIC-Folder-Icon-Changer


0
投票

将图标分配给文件夹基本上涉及两个步骤(如果算上创建文件夹,则可能需要三个步骤):

在要为其创建图标的文件夹(“目标文件夹”)内创建一个desktop.ini 文件。 将目标文件夹的属性设置为“系统”。

更多:

使用 C# 在 Windows 资源管理器中创建文件夹图标


0
投票

有一个 GitHub 项目 Vanara,它将 Windows P/Invoke 方法包装在非常漂亮且维护良好的 nuget 包中。

为了您的目的,我建议Vanara.PInvoke.Shell32

我使用命令行工具在 Visual Studio 2022 中使用 .NET 8 和 nuget Vanara.PInvoke.Shell32 v3.4.17 对其进行了测试。

using Vanara.PInvoke;

using static Vanara.PInvoke.Shell32;

SetBoxiconToFolder(@"C:\my folder", @"C:\my folder\my icon.ico");

static void SetBoxiconToFolder(string folder, string? fullFilenameToIcon = null)
{
    if (string.IsNullOrWhiteSpace(fullFilenameToIcon)) return;

    HRESULT result;

    SHFOLDERCUSTOMSETTINGS folderSettings = default;
    result = Shell32.SHGetSetFolderCustomSettings(ref folderSettings, folder, FCS.FCS_READ);
    if (result == HRESULT.S_OK)
    {
        folderSettings.dwMask = FOLDERCUSTOMSETTINGSMASK.FCSM_ICONFILE;

        folderSettings.pszIconFile = fullFilenameToIcon;

        result = Shell32.SHGetSetFolderCustomSettings(ref folderSettings, folder, FCS.FCS_WRITE);
        if (result != HRESULT.S_OK)
        {
            throw new Exception($"Error with {result}");
        }
    }
}

重要:不要忘记设置

folderSettings.dwMask = FOLDERCUSTOMSETTINGSMASK.FCSM_ICONFILE;
:-)这花了我一段时间才弄清楚缺失的值,

我也尝试使用此符号“shell32.dll,-44”从 Windows 图标中获取黄色星星,但失败了。只是作为给您的信息。

...
- folderSettings.pszIconFile = fullFilenameToIcon;
+ folderSettings.pszIconFile = "shell32.dll";
+ folderSettings.iIconIndex = -44; // 44;
...
© www.soinside.com 2019 - 2024. All rights reserved.