2

XNA を使用しており、ファイルを Vista の「Saved Games」フォルダに保存したいと考えています。

My Documents のような同様の特別なフォルダーを取得できますEnvironment.GetFolderPath(Environment.SpecialFolder.MyDocuments)が、Saved Games フォルダーに相当するものを見つけることができません。このフォルダにアクセスするにはどうすればよいですか?

4

3 に答える 3

2

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 フォルダーに保存されます。

于 2009-04-09T02:49:48.823 に答える
1

そのための特別なフォルダー 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 定数を渡すと、ローカライズされた形式で保存されたゲーム フォルダーへのパスが返されます。

于 2009-04-09T02:49:29.697 に答える