ご存知のように、appdataフォルダーはこれです
C:\Users\*Username*\AppData\Roaming
Windows7の場合
私のアプリケーションはすべての種類のWindowsOSに展開されるため、100%の確率でフォルダーを取得できる必要があります。問題は、C++でどのようにそれを行うかです。正確なWindowsOSがわからないので、XP、Vista、または7である可能性があり、最も重要なのは、ユーザー名がわからないことです。
すべてのバージョンのWindowsとの互換性を最大限に高めるために、SHGetFolderPath関数を使用できます。パスを取得するフォルダーのCSIDL値を
指定する必要があります。アプリケーションデータフォルダの場合、それはになります。CSIDL_APPDATA
Windows Vista以降では、代わりにこのSHGetKnownFolderPath関数を使用する必要があります。この関数では、フォルダーのKNOWNFOLDERID値を指定する必要があります。この場合も、アプリケーションデータフォルダの場合、適切な値はFOLDERID_RoamingAppDataです。
C ++アプリケーションからこれらの関数のいずれかを使用するには、を含める必要がありますshlobj.h。
次のことを試すことができます。
char* appdata = getenv("APPDATA");
SETこのコードは、環境変数APPDATAを読み取ります(コマンドウィンドウに入力したときにも表示されます)。これは、システムの起動時にWindowsによって設定されます。
ユーザー名を含み、使用しているOSバージョンを考慮して、ユーザーappdataのパスを絶対パスとして返します。
おそらく、仲間のGoogle社員は、std::filesystemを見るのが面白いと思うかもしれません。たとえば、Windows10のデフォルトの一時ディレクトリの場所とAppDataディレクトリ構造を想定してみましょう。
#include <filesystem>
auto path = std::filesystem::temp_directory_path()
.parent_path()
.parent_path();
path /= "Roaming";
if (!std::filesystem::exists(path))
std::filesystem::create_directories(path);
OPの場合、これで問題が解決しないと思います。システム構成は上記を簡単に変更したり壊したりする可能性があるため、100%堅牢な実装が必要な状況で上記を実行しないように注意してください。
しかし、おそらく、質問への新しい訪問者は、std::filesystemが役立つと思うかもしれません。たぶん、あなたがそれを探しているなら、あなたはディレクトリ内のアイテムを操作したいと思うでしょう、そしてこれのために、std::filesystemはあなたの友達になることができます。
誰かが簡単な実装を探しているなら、ここに私のものがあります:
#include <windows.h>
#include <shlobj.h>
#include <filesystem>
#include <iostream>
int main(void)
{
std::filesystem::path path;
PWSTR path_tmp;
/* Attempt to get user's AppData folder
*
* Microsoft Docs:
* https://docs.microsoft.com/en-us/windows/win32/api/shlobj_core/nf-shlobj_core-shgetknownfolderpath
* https://docs.microsoft.com/en-us/windows/win32/shell/knownfolderid
*/
auto get_folder_path_ret = SHGetKnownFolderPath(FOLDERID_RoamingAppData, 0, nullptr, &path_tmp);
/* Error check */
if (get_folder_path_ret != S_OK) {
CoTaskMemFree(path_tmp);
return 1;
}
/* Convert the Windows path type to a C++ path */
path = path_tmp;
/* Free memory :) */
CoTaskMemFree(path_tmp);
std::cout << path << std::endl;
return 0;
}
これは古いC++バージョンの簡単な実装です:
#include <shlobj.h>
// ...
wchar_t* localAppDataFolder;
if (SHGetKnownFolderPath(FOLDERID_LocalAppData, KF_FLAG_CREATE, NULL, &localAppDataFolder) != S_OK) {
std::cerr << "problem getting appdata folder" << std::endl;
}
else std::wcout << L"folder found: " << localAppDataFolder << std::endl;