#include <iostream>
#include <windows.h>
#include <Shlobj.h>
#include <string>
#pragma comment(lib, "shell32.lib")
/******************************************************************************************
Function: TCHAR2STRING
Description: TCHAR转string
Input: str:待转化的TCHAR*类型字符串
Return: 转化后的string类型字符串
*******************************************************************************************/
std::string TCHAR2STRING(TCHAR* str)
{
std::string strstr;
try
{
int iLen = WideCharToMultiByte(CP_ACP, 0, str, -1, NULL, 0, NULL, NULL);
char* chRtn = new char[iLen * sizeof(char)];
WideCharToMultiByte(CP_ACP, 0, str, -1, chRtn, iLen, NULL, NULL);
strstr = chRtn;
}
catch (std::exception e)
{
}
return strstr;
}
std::string GetUserFolder()
{
TCHAR path[255];
SHGetSpecialFolderPath(0, path, CSIDL_PROFILE, 0);
std::string rlt = TCHAR2STRING(path);
return rlt;
}
std::string GetDesktopFolder()
{
TCHAR path[255];
//获取当前用户的桌面路径
SHGetSpecialFolderPath(0, path, CSIDL_DESKTOPDIRECTORY, 0);
std::string rlt=TCHAR2STRING(path);
return rlt;
}
//获取程序exe所在路径,字符最后没有斜杠
std::string GetExePath()
{
char szFilePath[MAX_PATH + 1] = { 0 };
GetModuleFileNameA(NULL, szFilePath, MAX_PATH);
/*
strrchr:函数功能:查找一个字符c在另一个字符串str中末次出现的位置(也就是从str的右侧开始查找字符c首次出现的位置),
并返回这个位置的地址。如果未能找到指定字符,那么函数将返回NULL。
使用这个地址返回从最后一个字符c到str末尾的字符串。
*/
(strrchr(szFilePath, '\\'))[0] = 0; // 删除文件名,只获得路径字串//
std::string path = szFilePath;
return path;
}
int main()
{
std::string res= GetUserFolder();
std::cout << res << "\n";
return 0;
}
请注意SHGetSpecialFolderPath函数我们只需要修改一些宏即可获取不同目录,以下是宏定义
宏 | 介绍 |
CSIDL_ADMINTOOLS、CSIDL_COMMON_ADMINTOOLS | 管理工具 |
CSIDL_ALTSTARTUP、 CSIDL_COMMON_STARTUP、CSIDL_STARTUP | 程序 - 启动 |
CSIDL_APPDATA | AppData |
CSIDL_CDBURN_AREA | 临时刻录文件夹 |
CSIDL_COMMON_TEMPLATES、CSIDL_TEMPLATES | Templates |
CSIDL_COMMON_APPDATA | ProgramData |
CSIDL_COMMON_DESKTOPDIRECTORY、CSIDL_DESKTOP、CSIDL_DESKTOPDIRECTORY | 桌面 |
CSIDL_COMMON_DOCUMENTS、CSIDL_MYDOCUMENTS、CSIDL_PERSONAL | 文档 |
CSIDL_COMMON_FAVORITES、CSIDL_FAVORITES | 收藏夹 |
CSIDL_COMMON_MUSIC、CSIDL_MYMUSIC | 音乐 |
CSIDL_COMMON_PICTURES、CSIDL_MYPICTURES | 图片 |
CSIDL_COMMON_PROGRAMS、CSIDL_PROGRAMS | 开始菜单 - 程序 |
CSIDL_COMMON_STARTMENU、CSIDL_STARTMENU | 开始菜单 |
CSIDL_COMMON_VIDEO 、CSIDL_MYVIDEO | 视频 |
CSIDL_COOKIES | INetCookies |
CSIDL_FONTS | 字体 |
CSIDL_HISTORY | 历史 |
CSIDL_INTERNET_CACHE | INetCache |
CSIDL_LOCAL_APPDATA | AppData/Local |
CSIDL_NETHOOD | Network Shortcuts |
CSIDL_PRINTHOOD | Printer Shortcuts |
CSIDL_PROFILE | 当前用户(Administrator) |
CSIDL_PROGRAM_FILES 、CSIDL_PROGRAM_FILESX86 | Program Files |
CSIDL_PROGRAM_FILES_COMMON、CSIDL_PROGRAM_FILES_COMMONX86 | Common Files |
CSIDL_RECENT | 最近使用的项目 |
CSIDL_RESOURCES | Resources |
CSIDL_SENDTO | 发送到 |
CSIDL_SYSTEM | System32 |
CSIDL_SYSTEMX86 | SysWOW64 |
CSIDL_WINDOWS | Windows |