我正在使用 XNA,我想将文件保存到 Vista 的“已保存游戏”文件夹中。
我可以获得类似的特殊文件夹,例如 My Documents ,Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
但我找不到 Saved Games 文件夹的等效文件夹。我如何进入这个文件夹?
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。
没有特殊的文件夹 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 文件夹的路径。
我发现获取已保存游戏路径的最简单方法是读取注册表值,如下所示:
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 作为默认设置,因为我认为这适用于有人从未更改过位置的默认情况。