在哪个目录中写入游戏保存文件/数据?


37

我需要一个明确的目录列表,每个平台一个或多个,用于存放游戏保存文件和其他游戏生成数据的目录。要么基于OS开发人员规范,要么因为没有建议,这是常见用法。

为每个平台提供一个答案,并提供不同的目录。另外,最好的示例是如何在C ++或C中获取目录位置,因为这是您将遇到的更多困难的语言。

地点:

  • 玩家的游戏数据(保存的游戏,配置)。
  • 共享的游戏数据(例如所有计算机用户的高分或配置)。
  • 临时游戏数据(又名缓存目录)。

1
您可能应该将所有答案合并为一个,因为没有一个答案可以接受吗?
Zolomon 2012年

@Zolomon问题是我认为所有平台的答案都太大了。特别是如果您添加了移动/平板电脑平台……
Klaim 2012年

可能值得注意的是(因为可能会有更多的人对此表示赞同),至少我讨厌当游戏没有保存到其受人尊敬的(安装)目录中时。我喜欢在游戏中创建游戏内用户的游戏,而不再需要隐藏游戏:我用于游戏的PC永远不会多用户使用,因此根本无法使用OS用户。或者,如果必须使用它,我喜欢内部进行游戏的游戏。可能不是这样,但是:一个OS用户=一个游戏用户alterego的想法也令人不快。请注意,我是Windows游戏玩家。在* unix上有所不同,固定FS强制执行此概念(没有驱动器)
n611x007 2012年

@naxa如果可以“安慰”您,那么我正在开发一款内部具有玩家帐户管理的游戏,但是出于操作系统安全的原因,玩家帐户仍必须存储在用户帐户中。我也可能不确定将它们存储在共享存储库中。另外,我需要允许用户在某些时候保持数据在线。
克莱姆(Klaim)2012年

3
@naxa问题是在Vista,Windows7,Windows8上,除非专门以管理员身份运行,否则程序将无法写入Program Files \ Game-Install-Dir \。我相信在最新的Linux和OSX版本上也是如此。
Nate 2012年

Answers:


23

Windows(XP及更高版本)

基于:

这些位置假定Windows安装在C:磁盘上。在您自己的目录中附加游戏名称或游戏公司,然后在这些目录中添加游戏名称。


如果使用Window 8 Metro风格的应用程序,则必须使用特定的API而不是尝试访问目录。读:


玩家的游戏数据

Windows Vista及以下版本:

C:\ Users \ {用户名} \ AppData \ Roaming

Windows XP:

C:\ Documents and Settings \ {用户名} \ Application Data

您可以通过获取APPDATA环境变量来自动获取正确的用户名相关地址。

标准C(所有编译器):

char* appdata = getenv("APPDATA");

Visual Studio 20xx(避免getenv()警告说这不安全)-非Metro风格:

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

Boost用户:目前,我编写的boost.filesystem(这也是向下一个C ++标准提议的文件系统库的草案)还没有实现提供正确目录的功能。但是,以前对此已有讨论。如果发生变化,请随时更新此部分。


共享游戏数据

Windows Vista及以下版本:

C:\ ProgramData

Windows XP:

C:\ Documents and Settings \所有用户

您可以通过获取PROGRAMDATA环境变量来自动获取正确的地址。

标准C(所有编译器):

char* appdata = getenv("PROGRAMDATA");

Visual Studio 20xx(避免getenv()警告说这不安全)-非Metro风格:

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

Boost用户:目前,我编写的boost.filesystem(这也是向下一个C ++标准提议的文件系统库的草案)还没有实现提供正确目录的功能。但是,以前对此已有讨论。如果发生变化,请随时更新此部分。


临时游戏数据

Windows Vista及以下版本:

C:\ ProgramData

Windows XP:

C:\ Documents and Settings \ {用户名} \ Local Settings \ Temp

您可以通过获取TEMP环境变量来自动获取正确的地址。

C ++ Boost用户:为此,有一个简单的跨平台boost.filesystem函数

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

标准C(所有编译器):

char* appdata = getenv("TEMP");

Visual Studio 20xx(避免getenv()警告说这不安全)-非Metro风格:

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

4
在Vista或更高版本上,最好将游戏保存位置放在特殊的“保存的游戏”文件夹中。这里的更多信息:msdn.microsoft.com/zh-cn/library/windows/desktop/…寻找“ FOLDERID_SavedGames”
Durza007 2012年

1
实际上,您绝对不应尝试自己猜测路径或从环境变量构造路径。在Vista或更高版本上,您应该调用SHGetKnownFolderPath(msdn.microsoft.com/en-us/library/bb762188.aspx),在XP和更低版本上,请使用SHGetFolderPath(msdn.microsoft.com/en-us/library/bb762181.aspx
Kylotan 2012年

@Kylotan和Durza007,我的时间有点短,请随时根据需要编辑此答案。做了这个答案社区维基。
克莱姆(Klaim)2012年

我认为必须指出,msdn文档建议使用SHGetKnownFolderPath,因为SHGetFolderPath只是新方法的包装,并且仅受向后兼容性的支持。
Kagemusha 2012年

16

苹果系统

基于:

在基于unix的OS中,该~目录自动位于用户特定数据所在的用户主目录中。这意味着无论使用哪种语言,在这些平台上,您都可以使用~而不是使用特定于OS的功能来自动访问此文件夹。还要注意,这/是整个系统的根路径,而不是主磁盘根的路径。

在您自己的目录中附加游戏名称或游戏公司,然后在这些目录中添加游戏名称。


玩家的游戏数据

Apple的准则是在此处找到保存和配置文件,以使它们自动保存在云中(如果可用):

〜/文件

但是,更好的做法(也是更经常使用的做法)将这些文件定位在:

〜/图书馆/应用程序支持/

只是知道在这种情况下,文件不会自动保存到云中。如果您希望玩家选择,请使用平台的API进行选择。

共享游戏数据

/图书馆/应用程序支持

请注意,这里没有~,它不是相对于用户的家,而是相对于系统的根。

临时游戏数据:

如果在两次执行之间不需要保留数据:

/ tmp

如果需要在两次执行之间保留数据;

/库/缓存(对于MacOSX)

C ++ Boost用户:为此,有一个简单的跨平台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。那是供用户选择组织;您绝对不应写入Documents中的固定路径。您的游戏~/Library/Application Support/Your App Name/应用于保存和其他用户数据。
凯文·里德

@KevinReid“用户在应用程序的用户界面中创建和查看的文档-例如,Pages,Numbers和Keynote中的文档浏览器应存储在Documents目录中。Documents目录中可能包含的另一个文件示例是保存的游戏,再次是因为它们是应用程序可能提供某种选择方法的东西。” -资料来源:Apple的推荐,在第一个链接中。我错过了什么?
克莱姆(Klaim)2012年

2
在所有这些中,重点在于选择。用户选择他们的名字和去向。用户不管理的文件不应放在文档中,因为文档是用户的名称空间,而不是开发人员的名称空间。(免责声明:我并不是说我的建议与Apple文档是一致的。我确实声称它反映了Mac设计应用程序中的大多数实践,并且用户会对此感到满意。)
Kevin Reid

此外,X之前的Mac OS上没有“库”目录。链接文档中的“(OS X)”标记与iOS形成对比,这是一个完全不同的问题,因为iOS并未向用户公开文件系统。
凯文·里德

@KevinReid,我将更新Library的内容,谢谢。但是,对于您所说的选择和文档,这似乎是矛盾的。保存游戏与用户有关,而不与应用程序或开发人员有关。好吧,这取决于游戏,这就是为什么还有共享游戏数据目录的原因。所以我不明白您的意思。关于这个有一些合理的地方吗?
克莱姆(Klaim)2012年

13

Linux Debian(Ubuntu,Fedora等)

基于:

在基于unix的OS中,〜目录自动位于用户特定数据所在的用户主目录中。这意味着无论使用哪种语言,在这些平台上,您都可以使用〜而不是使用特定于OS的功能来自动访问此文件夹。另请注意,/是整个系统的根路径,而不是主磁盘根的路径。

在您自己的目录中附加游戏名称或游戏公司,然后在这些目录中添加游戏名称。


玩家的游戏数据

传统上,对于游戏Aquaria,它将是:

〜/。水族箱

请注意,.默认情况下,用户将隐藏以开头的目录和文件。

现在,大多数台式机都尝试遵守XDG规范,该规范建议

$ XDG_CONFIG_HOME /水族馆

要么

$ XDG_DATA_HOME /水族馆

进行配置和保存游戏。

如果$XDG_CONFIG_HOME未设置,请使用:

〜/ .config /水族馆

要么

〜/ .local / aquaria

这主要是为了整理用户的主目录,并在必要时允许用户运行应用程序的多个配置文件。规范中还有其他专用的用户特定目录。

共享游戏数据

/ var / games /

共享的配置文件应位于

/ etc / games /

临时游戏数据

/ tmp


1
详细说明:游戏“ Aquaria”应将其游戏数据放入〜/ .aquaria(或〜/ .config / Aquaria)中。在/ var中有一个可写世界的目录是很不容易的。实现这一目标的一般方法是为您的游戏创建一个用户帐户,并使其成为唯一可以写入该目录的帐户(然后在普通人玩游戏时使用setuid)。这可能比您想要的还要多。
dhasenan

好吧,实际上,大多数台式机现在都尝试遵循XDG规范,该规范建议使用$ XDG_CONFIG_HOME / aquaria(如果未设置,则建议使用〜/ .config / aquaria)和$ XDG_DATA_HOME / aquaria(或〜/ .local / aquaria)进行配置和建议。请改用savegames(请参阅standard.freedesktop.org/basedir-spec/basedir-spec-latest.html)。这主要是为了整理用户的主目录,并在必要时允许用户运行应用程序的多个配置文件。规范中还有其他专用的用户特定目录。
liori 2012年

@liori如果有时间,我明天会更新答案,对于延迟,我们深表歉意。如果您愿意并有时间,请随时更新信息。这对我也很有用。
克莱姆2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.