25

ご存知のように、appdataフォルダーはこれです

 C:\Users\*Username*\AppData\Roaming

Windows7の場合

私のアプリケーションはすべての種類のWindowsOSに展開されるため、100%の確率でフォルダーを取得できる必要があります。問題は、C++でどのようにそれを行うかです。正確なWindowsOSがわからないので、XP、Vista、または7である可能性があり、最も重要なのは、ユーザー名がわからないことです。

4

6 に答える 6

35

すべてのバージョンのWindowsとの互換性を最大限に高めるために、SHGetFolderPath関数を使用できます。パスを取得するフォルダーのCSIDL値を
指定する必要があります。アプリケーションデータフォルダの場合、それはになります。CSIDL_APPDATA

Windows Vista以降では、代わりにこのSHGetKnownFolderPath関数を使用する必要があります。この関数では、フォルダーのKNOWNFOLDERID値を指定する必要があります。この場合も、アプリケーションデータフォルダの場合、適切な値はFOLDERID_RoamingAppDataです。

C ++アプリケーションからこれらの関数のいずれかを使用するには、を含める必要がありますshlobj.h

于 2011-05-07T12:02:02.913 に答える
24

次のことを試すことができます。

char* appdata = getenv("APPDATA");

SETこのコードは、環境変数APPDATAを読み取ります(コマンドウィンドウに入力したときにも表示されます)。これは、システムの起動時にWindowsによって設定されます。

ユーザー名を含み、使用しているOSバージョンを考慮して、ユーザーappdataのパスを絶対パスとして返します。

于 2012-03-30T17:27:56.200 に答える
9

おそらく、仲間の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はあなたの友達になることができます。

于 2020-02-06T15:06:08.170 に答える
5

誰かが簡単な実装を探しているなら、ここに私のものがあります:

#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;
}

于 2020-06-10T23:55:26.337 に答える
4

このコードを使用して、環境変数「APPDATA」を読み取り
ます。最初にstdio.hファイルを含めます

char *pValue;
size_t len;
errno_t err = _dupenv_s(&pValue, &len, "APPDATA");

ここに画像の説明を入力してください

于 2019-04-10T10:27:44.880 に答える
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;
于 2021-11-22T10:24:26.660 に答える