如何将%AppData%路径作为std :: string?

时间:2016-03-16 23:36:12

标签: c++ string windows path appdata

我已经读过可以使用SHGetSpecialFolderPath();来获取AppData路径。但是,它返回TCHAR数组。我需要std::string

如何将其转换为std::string

更新

我已经读过可以使用getenv("APPDATA"),但它在Windows XP中不可用。我想支持Windows XP - Windows 10。

4 个答案:

答案 0 :(得分:2)

T类型表示SHGetSpecialFolderPath是一对函数:

  • SHGetSpecialFolderPathA用于基于Windows ANSI编码的基于char的文字,

  • SHGetSpecialFolderPathW用于基于UTF-16编码的wchar_t文本,Windows“”Unicode“。

ANSI变体只是Unicode变体的包装器,无法在所有情况下逻辑地生成正确的路径。

但这是基于char的数据所需要的。

另一种方法是使用函数的宽变量,并使用您熟悉的任何机制将宽文本结果转换为您选择的基于字节的char编码,例如: UTF-8。

请注意,UTF-8字符串不能直接用于通过Windows API打开文件等,因此这种方法只需要使用字符串进行更多转换。

但是,我建议在Windows中切换到宽文本。

为此,请在包含UNICODE之前定义宏符号<windows.h>

这也是Visual Studio项目的默认设置。

答案 1 :(得分:1)

您应该使用SHGetSpecialFolderPathA()使该函数明确处理ANSI字符。

然后,像往常一样将char的数组转换为std::string

/* to have MinGW declare SHGetSpecialFolderPathA() */
#if !defined(_WIN32_IE) || _WIN32_IE < 0x0400
#undef _WIN32_IE
#define _WIN32_IE 0x0400
#endif

#include <shlobj.h>
#include <string>

std::string getPath(int csidl) {
    char out[MAX_PATH];
    if (SHGetSpecialFolderPathA(NULL, out, csidl, 0)) {
        return out;
    } else {
        return "";
    }
}

答案 2 :(得分:1)

https://msdn.microsoft.com/en-gb/library/windows/desktop/dd374131%28v=vs.85%29.aspx

#ifdef UNICODE
    typedef wchar_t TCHAR;
#else
    typedef unsigned char TCHAR;
#endif

基本上你可以将这个数组转换为std::wstring。使用std::string转换为std::wstring_convert非常简单。

http://en.cppreference.com/w/cpp/locale/wstring_convert

答案 3 :(得分:0)

Typedef String作为std :: string或std :: wstring,具体取决于您的编译配置。以下代码可能有用:

#ifndef UNICODE  
  typedef std::string String; 
#else
  typedef std::wstring String; 
#endif