取当前用户的AppData路径

Home / C++ MrLee 2016-11-23 3594

CSIDL 表示的是windows shell中一个特殊文件夹的标识值。这里说的特殊文件夹指的是由windows shell所定义的文件夹,例如:"我的文档","回收站","Inernet Cache文件夹"就是一些由SHELL指定的特殊文件夹.这些特殊文件夹可以是一个磁盘上的物理路径,也可以是一个虚拟文件夹(Virtual Folder)!
WINSHELLAPI HRESULT WINAPI SHGetSpecialFolderLocation( HWND hwndOwner, int nFolder, LPITEMIDLIST *ppidl); Retrieves the PIDL of a special folder. Returns NOERROR if successful, or an OLE-defined error result otherwise.hwndOwnerHandle to the owner window the client should specify if it displays a dialog box or message box.nFolderValue specifying the folder for which to retrieve the location. This parameter can be one of the following values:
// TestSHGetSpecialFolderLocation.cpp : Defines the entry point for the console application.  
//  
  
#include "stdafx.h"  
  
#include <io.h>  
  
  
#include <Shlobj.h>  
#pragma comment( lib, "shell32.lib"  
  
#include <string>  
#include <iostream>  
)  
  
using namespace std;  
  
/* 
功能:取用户的AppData路径,并在下面建一个新的目录 
测试环境:WinXP SP3 + VS2010 
最后更新日期:2014-6-12      
参考资料:http://blog.csdn.net/roger_77/article/details/1538447 
*/  
  
std::wstring GetLocalAppDataPath()  
{  
    wchar_t m_lpszDefaultDir[MAX_PATH];  
    wchar_t szDocument[MAX_PATH] = {0};     
    memset(m_lpszDefaultDir, 0, _MAX_PATH);  
  
    LPITEMIDLIST pidl = NULL;  
    SHGetSpecialFolderLocation(NULL,   CSIDL_LOCAL_APPDATA,   &pidl);  
    if   (pidl && SHGetPathFromIDList(pidl, szDocument))  
    {     
        GetShortPathName(szDocument,m_lpszDefaultDir, _MAX_PATH);  
    }  
  
    std::wstring wsR = m_lpszDefaultDir;  
  
    return wsR;  
}  
  
std::wstring GetLocalAppDataPath(std::wstring appName)  
{  
    std::wstring path =  GetLocalAppDataPath();  
    path.append(L"\\");  
    path.append(appName);  
  
    if ( _waccess(path.c_str(), 0) == -1 )  
    {  
        _wmkdir(path.c_str());  
    }  
  
    return path;  
}  
  
int _tmain(int argc, _TCHAR* argv[])  
{  
    const std::wstring AppName = L"kagula";  
  
    std::wstring path =  GetLocalAppDataPath(AppName);  
    std::wcout << path << std::endl;  
  
#ifdef _DEBUG  
    ::system("pause");  
#endif  
  
    return 0;  
}  

 

本文链接:https://www.it72.com/11329.htm

推荐阅读
最新回复 (0)
返回