ご存知のように、appdataフォルダーはこれです
C:\Users\*Username*\AppData\Roaming
windows7で
私のアプリケーションはすべての種類のWindowsOSに展開されるため、100%の確率でフォルダーを取得できる必要があります。問題は、C++でどのようにそれを行うかです。正確なWindowsOSがわからないので、XP、Vista、または7である可能性があります。最も重要なのは、ユーザー名が何であるかがわからないことです。
すべてのバージョンのWindowsとの互換性を最大にするために、 SHGetFolderPath
function を使用できます。
パスを取得するフォルダーの [〜#〜] csidl [〜#〜] 値を指定する必要があります。アプリケーションデータフォルダの場合、それはCSIDL_APPDATA
になります。
Windows Vista以降では、代わりに SHGetKnownFolderPath
function を使用する必要があります。これには、フォルダーの KNOWNFOLDERID
値を指定する必要があります。この場合も、アプリケーションデータフォルダーの場合、適切な値はFOLDERID_RoamingAppData
です。
C++アプリケーションからこれらの関数のいずれかを使用するには、shlobj.h
を含める必要があります。
次のことを試すことができます。
char* appdata = getenv("APPDATA");
このコードは、環境変数APPDATAを読み取ります(コマンドウィンドウでSET
と入力したときにも表示されます)。これは、システムの起動時にWindowsによって設定されます。
ユーザーのappdata
のパスを絶対パスとして返します。これには、ユーザー名が含まれ、使用しているOSバージョンが考慮されます。
おそらく、仲間の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はあなたの友達になることができます。