イネマルのプログラミング備忘録

趣味プログラマのメモ

C++ 環境変数を含むパスをstd::stringに展開する方法

はじめに

パスに限らず、環境変数を含む文字列は、
WindowsAPIの ExpandEnvironmentStrings で展開できます。
std::string に展開する方法をメモ。

実装

#include <windows.h>
#include <iostream>
#include <string>

// 環境変数を含むパスを展開する
bool GetExpandEnvironmentPath(const std::string& path, std::string& dest)
{
    dest.resize(ExpandEnvironmentStringsA(path.c_str(), nullptr, 0));
    if (path.empty()) {
        return false;
    }
    ExpandEnvironmentStringsA(path.c_str(), &dest.front(), dest.size());
    return true;
}

int main()
{
    // 元のパス
    const char* basePath = "%tmp%\\data.bin";

    // 展開
    std::string resultPath;
    if (GetExpandEnvironmentPath(basePath, resultPath)) {
        std::cout << "展開前:" << basePath << std::endl;
        std::cout << "展開後:" << resultPath << std::endl;
    }
    else {
        std::cout << "失敗" << std::endl;
    }

    system("pause");
    return 0;
}

あとがき

今回は、stringに展開しましたが、
wstring なら ExpandEnvironmentStringsW で展開できます。