如何获取文件资源管理器Type列的文件类型?能否用C++程序化获取?
如何用C++获取文件资源管理器Type列的内容?
可以,Windows系统下,文件资源管理器Type列的内容来自注册表中文件扩展名关联的友好描述,你可以通过Win32 API的AssocQueryString函数直接获取这个值。
实现要点
- 依赖
Shlwapi库中的AssocQueryString函数,该函数专门用于查询文件类型关联信息 - 编译时需要链接
shlwapi.lib库
代码示例
#include <windows.h> #include <shlwapi.h> #include <string> #include <iostream> // 自动链接shlwapi库 #pragma comment(lib, "shlwapi.lib") std::wstring GetFileTypeName(const std::wstring& filePath) { wchar_t typeNameBuffer[256] = {0}; HRESULT queryResult; // 优先直接查询文件路径对应的类型描述 queryResult = AssocQueryStringW( ASSOCF_NONE, ASSOCSTR_FRIENDLYDOCNAME, filePath.c_str(), nullptr, typeNameBuffer, sizeof(typeNameBuffer) / sizeof(wchar_t) ); if (SUCCEEDED(queryResult)) { return typeNameBuffer; } // 直接查询失败时,提取扩展名单独查询 const wchar_t* fileExt = PathFindExtensionW(filePath.c_str()); if (fileExt && *fileExt != L'\0') { queryResult = AssocQueryStringW( ASSOCF_NONE, ASSOCSTR_FRIENDLYDOCNAME, fileExt, nullptr, typeNameBuffer, sizeof(typeNameBuffer) / sizeof(wchar_t) ); if (SUCCEEDED(queryResult)) { return typeNameBuffer; } } // 无匹配类型时返回默认值 return L"Unknown File"; } // 测试用例 int main() { std::wstring txtFile = L"C:\\example.txt"; std::wstring jpgFile = L"C:\\photo.jpg"; std::wcout << L"Type of " << txtFile << L": " << GetFileTypeName(txtFile) << std::endl; std::wcout << L"Type of " << jpgFile << L": " << GetFileTypeName(jpgFile) << std::endl; return 0; }
关键说明
ASSOCSTR_FRIENDLYDOCNAME参数指定获取的是友好文档名称,也就是文件资源管理器Type列显示的文本- 先尝试直接查询文件路径,适配无扩展名但有类型关联的文件;如果失败,再提取扩展名单独查询
- 代码使用宽字符版本的API(
AssocQueryStringW),避免编码问题
内容的提问来源于stack exchange,提问作者Joe J
相关产品推荐
相关产品推荐

