使用 SHGetSpecialFolderPath 和 SHGetFolderPath来获取系统特殊文件夹路径,并使用 PathAppend 对路径进行组装,避免手工对文件路径进行判断,测试代码如下:
#include <string>
#include <Windows.h>
#include <tchar.h>
#include <ShlObj.h>
#include <Shlwapi.h>//PathAppendW
#pragma comment (lib, "shlwapi.lib")
//C:\Users\Kandy\AppData\Roaming
std::wstring GetUserAppDataDir(void)
{
//
std::wstring appdata;
wchar_t buffer[MAX_PATH];
::ZeroMemory(buffer, MAX_PATH*sizeof(wchar_t));
if (::SHGetSpecialFolderPath(NULL, buffer, CSIDL_APPDATA, NULL))
{
appdata = buffer;
/*if (appdata.substr(appdata.length() - 1) != L"\\")
{
appdata.append(L"\\");
}*/
}
//不为空
wchar_t szTmp [MAX_PATH] = {0};
wcscpy_s(szTmp, appdata.c_str());
::PathAppendW(szTmp, L"hello.exe");
return szTmp;
}
//C:\Users\Kandy\AppData\Local
std::wstring GetLocalAppDataPath()
{
std::wstring wsValue = L"";
wchar_t wzLacalAppData[MAX_PATH] = {0};
if (SUCCEEDED(SHGetFolderPathW(NULL, CSIDL_LOCAL_APPDATA, NULL, SHGFP_TYPE_CURRENT, wzLacalAppData)))
{
wsValue = wzLacalAppData;
}
return wsValue;
}
int _tmain(int argc, _TCHAR* argv[])
{
wprintf(L"GetUserAppDataDir : %s\n", GetUserAppDataDir().c_str());
wprintf(L"GetLocalAppDataPath : %s\n", GetLocalAppDataPath().c_str());
system("pause");
return 0;
}
输出结果:
GetUserAppDataDir : C:\Users\Kandy\AppData\Roaming\hello.exe
GetLocalAppDataPath : C:\Users\Kandy\AppData\Local