You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用SHGetFileInfo()获取系统文件夹图标却得到错误图标

问题原因与解决办法

你的问题出在第一个参数传了空字符串_T(""),结合SHGFI_USEFILEATTRIBUTES和FILE_ATTRIBUTE_DIRECTORY,Windows会把空字符串识别为驱动器根目录(比如系统盘C:\),而非普通文件夹,所以返回的自然是驱动器图标,iIcon=80正好对应系统默认的驱动器大图标索引。

修正方案

方案1:传递有效文件夹路径

直接传入一个合法的文件夹路径(比如当前目录_T("."),或者任意存在的文件夹路径),保留原有的参数组合即可获取普通文件夹图标:

SHGetFileInfo(
    _T("."),
    FILE_ATTRIBUTE_DIRECTORY,
    &sfi, sizeof(sfi),
    SHGFI_ICON | SHGFI_LARGEICON | SHGFI_USEFILEATTRIBUTES);

方案2:获取系统标准文件夹图标(无需真实路径)

如果不想依赖真实存在的文件夹,可以通过SHGetFolderPath获取系统标准文件夹(比如桌面、文档)的路径,再调用SHGetFileInfo:

TCHAR szStandardFolder[MAX_PATH];
// 获取桌面文件夹路径作为示例
SHGetFolderPath(NULL, CSIDL_DESKTOPDIRECTORY, NULL, 0, szStandardFolder);

SHGetFileInfo(
    szStandardFolder,
    FILE_ATTRIBUTE_DIRECTORY,
    &sfi, sizeof(sfi),
    SHGFI_ICON | SHGFI_LARGEICON | SHGFI_USEFILEATTRIBUTES);

方案3:通过系统图标列表获取索引

如果只需要图标索引,结合SHGFI_SYSICONINDEX时,要确保传入的是文件夹标识而非根目录。比如用_T("*")配合FILE_ATTRIBUTE_DIRECTORY:

SHGetFileInfo(
    _T("*"),
    FILE_ATTRIBUTE_DIRECTORY,
    &sfi, sizeof(sfi),
    SHGFI_SYSICONINDEX | SHGFI_LARGEICON | SHGFI_USEFILEATTRIBUTES);
// 此时sfi.iIcon会返回普通文件夹的图标索引,而非驱动器的80

内容的提问来源于stack exchange,提问作者Nick Gris

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 11:52:12