XNA を使用しており、ファイルを Vista の「Saved Games」フォルダに保存したいと考えています。
My Documents のような同様の特別なフォルダーを取得できますEnvironment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
が、Saved Games フォルダーに相当するものを見つけることができません。このフォルダにアクセスするにはどうすればよいですか?
http://msdn.microsoft.com/en-us/library/bb200105.aspx#ID2EWD
必要なことを行うには、Microsoft.Xna.Framework.Storage と StorageLocation クラスを使用する必要があるようです。
現在、PC 上のタイトルの場所は、実行時に実行可能ファイルが存在するフォルダーです。パスにアクセスするには、TitleLocation プロパティを使用します。
ユーザーストレージは、現在ログインしているユーザーの My Documents フォルダー内の SavedGames フォルダーにあります。OpenContainer メソッドに渡された titleName に従って、ゲームごとにサブフォルダーが作成されます。PlayerIndex が指定されていない場合、コンテンツは AllPlayers フォルダーに保存されます。PlayerIndex が指定されている場合、コンテンツは、BeginShowStorageDeviceSelector に渡された PlayerIndex に応じて、Player1、Player2、Player3、または Player4 フォルダーに保存されます。
そのための特別なフォルダー const はありませんので、システム変数を使用してください。このウィキペディアの記事Special Foldersによると、保存されたゲームのフォルダーは次のとおりです。
保存されたゲーム %USERPROFILE%\保存されたゲーム Vista
したがって、コードは次のようになります。
string sgPath = System.IO.Path.Combine(Environment.GetEnvironmentVariable("USERPROFILE"), "saved games"));
...
編集: コメントによると、ローカリゼーションが問題であり、質問によると、API を使用するのではなく、保存されたゲーム フォルダーに直接アクセスしたい場合は、以下が役立つ場合があります。
RedGate リフレクターを使用すると、GetFolderPath が次のように実装されていることがわかります。
public static string GetFolderPath(SpecialFolder folder)
{
if (!Enum.IsDefined(typeof(SpecialFolder), folder))
{
throw new ArgumentException(string.Format(CultureInfo.CurrentCulture, GetResourceString("Arg_EnumIllegalVal"), new object[] { (int) folder }));
}
StringBuilder lpszPath = new StringBuilder(260);
Win32Native.SHGetFolderPath(IntPtr.Zero, (int) folder, IntPtr.Zero, 0, lpszPath);
string path = lpszPath.ToString();
new FileIOPermission(FileIOPermissionAccess.PathDiscovery, path).Demand();
return path;
}
したがって、このメソッドの独自のバージョンを作成し、保存されたゲームのフォルダー ID を渡すだけでよいと思われるかもしれません。それはうまくいきません。Vista より前のこれらのフォルダ ID は、実際には CSIDL でした。それらのリストはここにあります。Note :ただし。
Vista のリリースで、Microsoft は CLSIDL を KNOWNFOLDERID に置き換えました。KNOWNFOLDERID のリストは、ここにあります。また、保存されたゲームの KNOWNFOLDERID は FOLDERID_SavedGames です。
しかし、古い CLSIDL ベースの SHGetFolderPath Win32 関数に新しい const を渡すだけではありません。この記事のKnown Foldersに従って、ご想像のとおり、 SHGetKnownFolderPathという新しい関数があり、新しい FOLDERID_SavedGames 定数を渡すと、ローカライズされた形式で保存されたゲーム フォルダーへのパスが返されます。