C# 如何通过编程查找Vista';s";“保存的游戏”;文件夹?

C# 如何通过编程查找Vista';s";“保存的游戏”;文件夹?,c#,.net,xna,C#,.net,Xna,我正在使用XNA,我想将文件保存到Vista的“保存的游戏”文件夹中 我可以通过Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)获得类似于“我的文档”的特殊文件夹,但我找不到与“已保存的游戏”文件夹等效的文件夹。如何访问此文件夹?没有专门的文件夹常量,因此只需使用系统变量即可。根据这篇维基百科文章,保存的游戏文件夹只是: 保存的游戏%USERPROFILE%\Saved Games Vista 因此,代码应该是:

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


我可以通过
Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
获得类似于“我的文档”的特殊文件夹,但我找不到与“已保存的游戏”文件夹等效的文件夹。如何访问此文件夹?

没有专门的文件夹常量,因此只需使用系统变量即可。根据这篇维基百科文章,保存的游戏文件夹只是:

保存的游戏%USERPROFILE%\Saved Games Vista

因此,代码应该是:

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

编辑:如果根据评论,本地化是一个问题,并且根据您的问题,您仍然希望直接访问已保存的游戏文件夹,而不是使用API,那么以下内容可能会有所帮助

使用RedGate reflector,我们可以看到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时,微软用KnownFolderId取代了CLSIDL。可以找到KnownFolderId的列表。保存的游戏KNOWNFOLDERID是FOLDERID_SavedGames

但您不只是将新常量传递给旧的、基于CLSIDL的SHGetFolderPath Win32函数。正如本文所述,正如您所料,有一个新函数被调用,您可以将新的FOLDERID_SavedGames常量传递给该函数,该函数将以本地化形式返回保存的游戏文件夹的路径。

看起来您需要使用Microsoft.Xna.Framework.Storage和StorageLocation类来完成所需的操作

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

用户存储在“我的文档”中 当前正在访问的用户的文件夹 已登录,位于SavedGames文件夹中。A. 为每个游戏创建子文件夹 根据传给他的书名 OpenContainer方法。当没有 已指定PlayerIndex,内容为 保存在AllPlayers文件夹中。当 如果指定了PlayerIndex,则内容 保存在Player1、Player2、, Player3或Player4文件夹,具体取决于 将PlayerIndex传递给 开始显示存储设备选择器


当游戏在非英语的系统上运行时?卡布姆!平心而论,维基百科的文章说“保存的游戏”应该本地化。@Craig:你知道微软对他们支持的每种语言都使用什么吗?为什么你甚至可以在使用API的时候尝试学习?在XP上应该做什么,在C++中,代码> FoDeIDiSaveDebug < /C>和<代码> SHGetKnownFolderPath <代码>不可用?本机C++回答:这回答了你的问题吗?这是一个C#问题,这是一个C/C++答案。通过一些修改来理解如何弥合这一差距,它可能会变成一个好的答案。