【问题标题】:How do you programatically find Vista's "Saved Games" folder?您如何以编程方式找到 Vista 的“已保存游戏”文件夹?
【发布时间】:2009-04-09 02:24:16
【问题描述】:

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

我可以使用Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) 获得类似的特殊文件夹,例如我的文档,但我找不到保存的游戏文件夹的等效文件夹。如何进入该文件夹?

【问题讨论】:

标签: c# .net xna


【解决方案1】:

http://msdn.microsoft.com/en-us/library/bb200105.aspx#ID2EWD

看起来您需要使用 Microsoft.Xna.Framework.Storage 和 StorageLocation 类来完成您需要做的事情。

目前,PC 上的标题位置 是可执行文件所在的文件夹 运行时驻留。使用 TitleLocation 属性来访问 路径。

用户存储在我的文档中 当前用户的文件夹 登录,在 SavedGames 文件夹中。一种 为每个游戏创建子文件夹 根据titleName传递给 OpenContainer 方法。没有时 PlayerIndex 是指定的,内容是 保存在 AllPlayers 文件夹中。当一个 PlayerIndex 是指定的,内容 保存在Player1、Player2、 Player3 或 Player4 文件夹,具体取决于 PlayerIndex 被传递到哪个 BeginShowStorageDeviceSelector。

【讨论】:

    【解决方案2】:

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

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

    所以代码是:

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

    ...

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

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

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

    【讨论】:

    • 当游戏在非英语系统上运行时?轰隆隆!
    • 公平地说,维基百科的文章说“保存的游戏”应该本地化。
    • @Craig:你知道微软为他们支持的每种语言使用什么吗?当您可以使用提供的 API 时,为什么还要尝试学习呢?
    • 在没有FOLDERID_SavedGamesSHGetKnownFolderPath 的XP 上应该怎么办?
    【解决方案3】:

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

    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 作为默认设置,因为我认为这适用于有人从未更改过位置的默认情况。

    【讨论】:

      猜你喜欢
      • 2019-06-27
      • 2016-08-09
      • 1970-01-01
      • 2020-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多