你如何以编程方式找到Vista的“Saved Games”文件夹?

时间:2009-04-09 02:24:17

标签: c# .net xna

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

我可以使用Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)获取类似My Documents的特殊文件夹但我找不到Saved Games文件夹的等效文件夹。我如何到达此文件夹?

2 个答案:

答案 0 :(得分:2)

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。

答案 1 :(得分:0)

没有特殊的文件夹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;
}

所以也许你认为我需要的只是创建我自己的这个方法版本并将其传递给Saved Games的文件夹ID。那不行。 Vista之前的那些文件夹ID实际上是CSIDL。可以找到它们的列表here。但请注意注意:

在发布Vista时,微软用KNOWNFOLDERID取代了CLSIDL。可以找到KNOWNFOLDERID列表here。已保存的游戏KNOWNFOLDERID是FOLDERID_SavedGames。

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