В какую директорию игры сохраняются файлы / данные?

37

Мне нужен определенный список каталогов, по одному или несколько на каждую платформу, куда нужно поместить файлы сохранения игры и другие данные, сгенерированные игрой . Либо на основе спецификации разработчика ОС, либо потому, что это обычное использование, если нет рекомендаций.

Пожалуйста, предоставьте один ответ для каждой платформы с разными каталогами. Кроме того, пример того, как получить расположение каталога в C ++ или C, является лучшим , так как это язык, с которым вам будет сложнее работать.

Место проживания:

  • Данные игры игрока (сохраненные игры, конфиг).
  • Совместно используемые данные игры (например, рекорды или настройки для всех пользователей компьютера).
  • Временные игровые данные (он же каталог кеша).
Klaim
источник
1
Вам, вероятно, следует объединить все ответы в один, так как нет единого ответа, который нужно принять?
Zolomon
@Zolomon Проблема в том, что один ответ со всеми платформами будет слишком большим, я думаю. В частности, если вы добавите мобильные / планшетные платформы ...
Klaim
может быть, стоит отметить (так как может быть больше тех, кто разделяет это мнение), что, по крайней мере, я ненавижу, когда игры не сохраняются в их уважительных (устанавливаемых) каталогах. Мне нравятся игры, в которых внутриигровые пользователи создаются внутри игры, и больше не нужно скрываться: компьютеры, которые я использую для игр, никогда не бывают многопользовательскими, чтобы вообще использовать пользователей ОС. Или, если он должен использовать это, мне нравятся игры, которые делают это внутренне. Возможно, дело не в этом, но: идея одного пользователя ОС = один кусочек игрового пользователя alterego также огорчает. заметьте, я геймер для Windows. на * unix все по-другому, фиксированная ФС заставляет
задуматься
@naxa Если это может вас «утешить», я создаю игру, в которой есть управление учетными записями игроков, но учетная запись игроков по-прежнему должна храниться в учетной записи пользователя по соображениям безопасности ОС. Я мог бы хранить их в общем репо тоже, не уверен. Кроме того, мне нужно разрешить пользователям хранить данные в сети в какой-то момент.
Klaim
3
@naxa Проблема в том, что в Vista, Windows7, Windows8, если они не запускаются с правами администратора, программы не смогут писать в Program Files \ Game-Install-Dir \. Я считаю, что это справедливо и для более поздних версий Linux и OSX.
Nate

Ответы:

23

Windows (XP и последующие)

На основании:

В этих местах предполагается, что Windows установлена ​​на диске C :. Добавьте в эти каталоги свой каталог с названием игры или игровой компании, а затем название игры.


Если вы используете приложение Windows 8 в стиле Metro , вам придется использовать определенный API, а не пытаться обращаться к каталогам. Читать:


Данные игры игрока

Windows Vista и следующие:

C: \ Users \ {имя пользователя} \ AppData \ Roaming

Windows XP:

C: \ Documents and Settings \ {имя пользователя} \ Данные приложения

Вы можете автоматически получить правильный адрес, зависящий от имени пользователя, получив APPDATAпеременную окружения .

Стандарт С (все компиляторы):

char* appdata = getenv("APPDATA");

Visual Studio 20xx ( избегайте предупреждения getenv () о том, что это небезопасно ) - не в стиле Metro:

char *pValue;
size_t len;
errno_t err = _dupenv_s( &pValue, &len, "APPDATA" ); 

Повышающие пользователи : в данный момент я пишу эту систему boost.files (которая также является проектом библиотеки файловой системы, предложенной для следующего стандарта C ++), пока не реализована функция, обеспечивающая правильный каталог. Тем не менее, были дискуссии об этом раньше . Пожалуйста, не стесняйтесь обновлять этот раздел, если что-то изменилось.


Данные общей игры

Windows Vista и следующие:

C: \ ProgramData

Windows XP:

C: \ Documents and Settings \ Все пользователи

Вы можете автоматически получить правильный адрес, получив PROGRAMDATAпеременную окружения .

Стандарт С (все компиляторы):

char* appdata = getenv("PROGRAMDATA");

Visual Studio 20xx ( избегайте предупреждения getenv () о том, что это небезопасно ) - не в стиле Metro:

char *pValue;
size_t len;
errno_t err = _dupenv_s( &pValue, &len, "PROGRAMDATA" ); 

Повышающие пользователи : в данный момент я пишу эту систему boost.files (которая также является проектом библиотеки файловой системы, предложенной для следующего стандарта C ++), пока не реализована функция, обеспечивающая правильный каталог. Тем не менее, были дискуссии об этом раньше . Пожалуйста, не стесняйтесь обновлять этот раздел, если что-то изменилось.


Временные игровые данные

Windows Vista и следующие:

C: \ ProgramData

Windows XP:

C: \ Documents and Settings \ {имя пользователя} \ Локальные настройки \ Temp

Вы можете автоматически получить правильный адрес, получив TEMPпеременную окружения .

C ++ пользователи Повышения : есть простой кросс-платформенный функция Boost.Filesystem для этого

namespace bfs = boost::filesystem;
const bfs::path TEMP_DIR = bfs::system_complete( bfs::temp_directory_path() ); // system_complete() call is optional

Стандарт С (все компиляторы):

char* appdata = getenv("TEMP");

Visual Studio 20xx ( избегайте предупреждения getenv () о том, что это небезопасно ) - не в стиле Metro:

char *pValue;
size_t len;
errno_t err = _dupenv_s( &pValue, &len, "TEMP" ); 
Klaim
источник
4
В Vista и более поздних версиях игровые сейфы должны быть помещены в специальную папку «Сохраненные игры». Более подробная информация здесь: msdn.microsoft.com/en-us/library/windows/desktop/… Ищите «FOLDERID_SavedGames»
Durza007
1
Вы никогда не должны пытаться угадать путь самостоятельно или построить его из переменных среды, на самом деле. В Vista и выше вы должны вызвать SHGetKnownFolderPath ( msdn.microsoft.com/en-us/library/bb762188.aspx ), а в XP и ниже использовать SHGetFolderPath ( msdn.microsoft.com/en-us/library/bb762181.aspx ).
Kylotan
@Kylotan и Durza007, мне немного не хватает времени, не стесняйтесь редактировать этот ответ по мере необходимости. Сделал этот ответ сообществу вики.
Klaim
Я думаю, что важно сказать, что документация msdn предлагает использовать SHGetKnownFolderPath, поскольку SHGetFolderPath является просто оболочкой для нового метода и поддерживается только для обратной совместимости.
Кагемуша
16

MacOS

На основании:

В ОС на основе Unix ~каталог автоматически располагается в домашнем каталоге пользователя, где находятся данные пользователя. Это означает, что на каком бы языке вы ни находились, на этих платформах вы можете автоматически обращаться к этой папке, используя ~функцию, не зависящую от ОС. Также обратите внимание, что /это корневой путь всей системы, а не путь к корню основного диска.

Добавьте в эти каталоги свой каталог с названием игры или игровой компании, а затем название игры.


Данные игры игрока

Руководство Apple состоит в том, чтобы найти файлы сохранения и конфигурации, чтобы они автоматически сохранялись в облаке, если они доступны:

~ / Документы

Тем не менее, лучше (и чаще использовать) практику, чтобы найти эти файлы в:

~ / Библиотека / Поддержка приложений /

Просто знайте, что в этом случае файлы не будут автоматически сохраняться в облаке. Если вы хотите, чтобы игрок выбрал, используйте API платформы, чтобы он сделал выбор.

Данные общей игры

/ Библиотека / Поддержка приложений

Обратите внимание, что это не так ~, это связано не с домом пользователя, а с корнем системы.

Временные игровые данные:

Если данные не нужно хранить между выполнениями:

/ TMP

Если данные должны храниться между казнями;

/ Библиотека / Кэши (для MacOSX)

C ++ пользователи Повышения : есть простой кросс-платформенный функция Boost.Filesystem для этого

namespace bfs = boost::filesystem;
const bfs::path TEMP_DIR = bfs::system_complete( bfs::temp_directory_path() ); // system_complete() call is optional
оборота клаим
источник
4
Не помещайте ничего в ~/Documents. Это для пользователя, чтобы выбрать организовать; Вы никогда не должны писать по фиксированному пути в Документах. Ваша игра должна использовать ~/Library/Application Support/Your App Name/для сохранения и других пользовательских данных.
Кевин Рид,
@KevinReid "Документы, которые пользователь создает и видит в пользовательском интерфейсе приложения, например браузеры документов в Pages, Numbers и Keynote, должны храниться в каталоге Documents. Другим примером файлов, которые могут находиться в каталоге Documents, являются сохраненные игры. опять же, потому что это то, что приложение потенциально может предоставить какой-то метод выбора ". - Источник: рекомендация Apple, в первой ссылке. Я что-то пропустил?
Klaim
2
Во всех этих акцент делается на выборе . Пользователь выбирает то, что они назвали и куда они идут. Файлы, которыми пользователь не управляет, не должны помещаться в Documents, поскольку Documents - это пространство имен пользователя, а не разработчика. (Отказ от ответственности: я не утверждаю, что мой совет согласуется с документацией Apple. Я утверждаю, что он отражает большую часть практики среди приложений, разработанных для Mac, и что пользователи будут довольны этим.)
Кевин Рейд,
Кроме того, в pre-X Mac OS не было каталогов «Library». Замечания «(OS X)» в связанной документации контрастируют с iOS , что является совершенно другим вопросом, поскольку iOS не предоставляет файловую систему пользователю.
Кевин Рид,
@KevinReid Я обновлю библиотеку, спасибо. Однако то, что вы говорите о выборе и документах, кажется противоречивым. Сохранение игр зависит от пользователя, а не от приложения или разработчика. Ну, это зависит от игры, поэтому существует также общий каталог данных игры. Поэтому я не понимаю, что вы имеете в виду. Есть ли что-то рациональное в этом?
Klaim
13

Linux Debian (Ubuntu, Fedora и т. Д.)

На основании:

В ОС на основе Unix каталог ~ автоматически располагается в домашнем каталоге пользователя, в котором находятся данные пользователя. Это означает, что независимо от языка, на этих платформах вы можете автоматически обращаться к этой папке, используя ~ вместо функции, специфичной для ОС. Также обратите внимание, что / - это корневой путь всей системы, а не путь к корню основного диска.

Добавьте в эти каталоги свой каталог с названием игры или игровой компании, а затем название игры.


Данные игры игрока

Традиционно для игры Aquaria это будет:

~ / .Aquaria

Обратите внимание, что каталоги и файлы, начинающиеся с, .будут по умолчанию скрыты для пользователя.

Большинство настольных компьютеров сейчас пытаются придерживаться спецификации XDG , которая рекомендует

$ XDG_CONFIG_HOME / аквариумы

или

$ XDG_DATA_HOME / аквариумы

для конфигурации и сохранения игр вместо.

Если $XDG_CONFIG_HOMEне установлено, используйте:

~ / .Config / аквариумы

или

~ / .Local / аквариумы

Это главным образом для того, чтобы освободить домашний каталог пользователя, а также позволить пользователям запускать несколько профилей приложения, если они сочтут это необходимым. В спецификации есть и другие специальные пользовательские каталоги.

Данные общей игры

/ Вар / игры /

Общие конфигурационные файлы должны находиться в

/ И т.д. / игры /

Временные игровые данные

/ TMP

оборота клаим
источник
1
Для уточнения: игра «Аквариум» должна поместить свои игровые данные в ~ / .aquaria (или ~ / .config / Aquaria). Не одобряется наличие каталога, доступного для записи в мире, в / var; общий способ сделать это состоит в том, чтобы создать учетную запись пользователя для вашей игры и сделать ее единственной учетной записью, которая может писать в этот каталог (а затем использовать setuid, когда в игру играют обычные люди). Это может быть больше работы, чем вы хотите.
дхасенан
Ну, на самом деле, большинство настольных компьютеров сейчас пытаются придерживаться спецификации XDG, которая рекомендует $ XDG_CONFIG_HOME / aquaria (или ~ / .config / aquaria, если не задано) и $ XDG_DATA_HOME / aquaria (или ~ / .local / aquaria) для конфигурации и Вместо этого сохраните игры (см. standard.freedesktop.org/basedir-spec/basedir-spec-latest.html ). Это главным образом для того, чтобы освободить домашний каталог пользователя, а также позволить пользователям запускать несколько профилей приложения, если они сочтут это необходимым. В спецификации есть и другие специальные пользовательские каталоги.
Лиори
@liori Я обновлю ответы завтра, если найду время, извините за задержку. Если вам это нравится и у вас есть время, пожалуйста, не стесняйтесь обновлять информацию. Это тоже полезно для меня.
Klaim