Как программно найти папку «Сохраненные игры» в Vista? - PullRequest
1 голос
/ 09 апреля 2009

Я использую XNA и хочу сохранить файлы в папке Vista Saved Games.

Я могу получить такие же специальные папки, как «Мои документы» с Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), но не могу найти эквивалент для папки «Сохраненные игры». Как мне попасть в эту папку?

Ответы [ 2 ]

2 голосов
/ 09 апреля 2009

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

Похоже, вам нужно использовать Microsoft.Xna.Framework.Storage и класс StorageLocation, чтобы делать то, что вам нужно.

В настоящее время название места на ПК это папка, в которой исполняемый файл проживает, когда он запущен. Использовать Свойство TitleLocation для доступа к путь.

Пользовательское хранилище находится в Моих Документах папка пользователя, который в данный момент авторизовался в папке SavedGames. подпапка создается для каждой игры в соответствии с названием метод OpenContainer. Когда нет PlayerIndex указан, контент сохраняется в папке AllPlayers. Когда PlayerIndex указан, содержание сохраняется в Player1, Player2, Папка Player3 или Player4, в зависимости на котором PlayerIndex был передан BeginShowStorageDeviceSelector.

0 голосов
/ 09 апреля 2009

Специальной папки const для нее не существует, поэтому просто используйте системные переменные. Согласно этой статье в Википедии Специальные папки , папка сохраненных игр просто:

Сохраненные игры% 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;
}

Так что, может быть, вы думаете, что все, что мне нужно, - это создать свою собственную версию этого метода и передать ей идентификатор папки для сохраненных игр. Это не сработает. Эти идентификаторы папок до Vista были на самом деле CSIDL. Список их можно найти здесь . Обратите внимание на Примечание: однако.

При выпуске Vista Microsoft заменила CLSIDL на KNOWNFOLDERID. Список KNOWNFOLDERID можно найти здесь . А сохраненные игры KNOWNFOLDERID - это FOLDERID_SavedGames.

Но вы не просто передаете новый const старой, основанной на CLSIDL, функции SHGetFolderPath Win32. Согласно этой статье, Известные папки , и, как и следовало ожидать, есть новая функция под названием SHGetKnownFolderPath , в которую вы передаете новую константу FOLDERID_SavedGames, которая возвращает путь к сохраненному Папка с играми в локализованном виде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...