2

我正在使用 XNA,我想将文件保存到 Vista 的“已保存游戏”文件夹中。

我可以获得类似的特殊文件夹,例如 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 时,内容将保存在 Player1、Player2、Player3 或 Player4 文件夹中,具体取决于传递给 BeginShowStorageDeviceSelector 的 PlayerIndex。

于 2009-04-09T02:49:48.823 回答
1

没有特殊的文件夹 const ,所以只需使用系统变量。根据这篇维基百科文章Special Folders,保存的游戏文件夹只是:

已保存的游戏 %USERPROFILE%\已保存的游戏 Vista

所以代码是:

 string sgPath = System.IO.Path.Combine(Environment.GetEnvironmentVariable("USERPROFILE"), "saved games"));

...

编辑:如果根据评论,本地化是一个问题,并且根据您的问题,您仍然希望直接访问 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。可以在此处找到它们的列表。注意注意:然而。

在发布 Vista 时,Microsoft 将 CLSIDL 替换为 KNOWNFOLDERID。可以在此处找到 KNOWNFOLDERID 列表。保存的游戏 KNOWNFOLDERID 是 FOLDERID_SavedGames。

但是您不只是将新的 const 传递给旧的、基于 CLSIDL 的 SHGetFolderPath Win32 函数。根据这篇文章Known Folders,正如您所料,有一个名为SHGetKnownFolderPath的新函数,您可以将新的 FOLDERID_SavedGames 常量传递给该函数,该函数将以本地化形式返回 Saved Games 文件夹的路径。

于 2009-04-09T02:49:29.697 回答
0

我发现获取已保存游戏路径的最简单方法是读取注册表值,如下所示:

var defaultPath = Path.Combine(Environment.GetEnvironmentVariable("USERPROFILE"), "Saved Games");
var regKey = "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders";
var regKeyValue = "{4C5C32FF-BB9D-43b0-B5B4-2D72E54EAAA4}";
var regValue = (string) Registry.GetValue(regKey, regKeyValue, defaultPath);

我通过 Shell 多次更改了已保存游戏的位置,并且每次都更改了此键的值。我使用 USERPROFILE/Saved Games 作为默认设置,因为我认为这适用于有人从未更改过位置的默认情况。

于 2021-08-15T00:37:59.423 回答