Как программно найти папку «Сохраненные игры» в Vista?

Я использую XNA и хочу сохранять файлы в папку «Сохраненные игры» Vista.

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


person Mag Roader    schedule 09.04.2009    source источник
comment
Собственный ответ C++: stackoverflow.com/questions/54499256/   -  person user5994461    schedule 29.07.2019
comment
Отвечает ли это на ваш вопрос? Как программно найти папку «Сохраненные игры» в C/C++ ?   -  person user5994461    schedule 30.05.2020
comment
Это вопрос C#, а это ответ C/C++. С некоторыми изменениями для понимания того, как преодолеть разрыв, это может превратиться в хороший ответ.   -  person Mag Roader    schedule 31.05.2020


Ответы (2)


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

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

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

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

person Nicolas Webb    schedule 09.04.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.

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

person rism    schedule 09.04.2009
comment
А когда игра запускается на системе не английской? Кабум! - person Samuel; 09.04.2009
comment
Честно говоря, в статье в Википедии говорится, что «сохраненные игры» должны быть локализованы. - person Craig; 09.04.2009
comment
@Craig: А вы знаете, что Microsoft использует для каждого поддерживаемого языка? Зачем вообще пытаться этому научиться, если можно использовать предоставленный API? - person Samuel; 09.04.2009
comment
Что делать на XP, где FOLDERID_SavedGames и SHGetKnownFolderPath недоступны? - person Merlyn Morgan-Graham; 23.01.2012