web-dev-qa-db-ja.com

C ++で%appdata%のフォルダを開く方法は?

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

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

windows7で

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

17
dikidera

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

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

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

22
Cody Gray

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

char* appdata = getenv("APPDATA");

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

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

18
iptq

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

0
Chris Mauer