Em qual diretório gravar jogo salvar arquivos / dados?

37

Preciso de uma lista definida de diretórios, um ou mais por plataforma, de onde colocar os arquivos salvos no jogo e outros dados gerados no jogo . Com base na especificação do desenvolvedor do SO ou porque é de uso comum se não houver recomendação.

Forneça uma resposta por plataforma , com diretórios diferentes. Além disso, é melhor o exemplo de como obter o local do diretório em C ++ ou C , pois é o idioma que você terá mais dificuldade.

Localizações:

  • Dados do jogo do jogador (jogos salvos, configuração).
  • Dados compartilhados do jogo (como pontuação alta ou configuração para todos os usuários de computador).
  • Dados temporários do jogo (também conhecido como diretório de cache).
Klaim
fonte
11
Você provavelmente deve colocar todas as respostas em uma, já que não há uma única resposta para aceitar?
Zolomon
@ Zolomon O problema é que uma resposta com todas as plataformas será muito grande, eu acho. Em particular, se você adicionar plataformas / tablet móveis ...
Klaim
pode valer a pena notar (já que pode haver mais que compartilhe essa opinião) que pelo menos eu odeio quando os jogos não são salvos em seus respeitosos diretórios (instalação). Gosto de jogos nos quais os usuários do jogo são criados no jogo, e não é mais necessário ocultar: os PCs que eu uso para jogos nunca são multiusuário o suficiente para usar os usuários do SO. Ou, se for necessário, gosto de jogos que o fazem internamente. Pode não ser o caso, mas: a idéia de um usuário do SO = uma parte do alterego do usuário do jogo também é angustiante. note que eu sou um jogador do Windows. no * unix é diferente, o FS fixo força o conceito (não há unidades)
n611x007
@naxa Se isso pode "consolá-lo", estou criando um jogo com gerenciamento de contas de jogadores, mas a conta dos jogadores ainda precisa ser armazenada na conta do usuário por motivos de segurança do sistema operacional. Também posso armazená-los em repositório compartilhado, não tenho certeza. Além disso, vou precisar permitir que os usuários mantenham os dados online em algum momento.
Klaim
3
@naxa O problema é que, no Vista, Windows7, Windows8, a menos que seja executado especificamente como administrador, os programas não poderão gravar em Arquivos de Programas \ Game-Install-Dir \. Eu acredito que isso também se aplica às versões mais recentes do Linux e OSX.
Nate

Respostas:

23

Windows (Xp e seguintes)

Baseado em:

Esses locais pressupõem que o Windows esteja instalado no disco C :. Anexe seu próprio diretório com o nome do jogo ou a empresa do jogo e, em seguida, o nome do jogo nesses diretórios.


Se você usar o aplicativo estilo Metro do Windows 8 , precisará usar uma API específica em vez de tentar acessar os diretórios. Ler:


Dados do jogo do jogador

Windows Vista e seguintes:

C: \ Usuários \ {nome de usuário} \ AppData \ Roaming

Windows XP:

C: \ Documents and Settings \ {nome de usuário} \ Dados do Aplicativo

Você pode obter automaticamente o endereço correto dependente do nome de usuário, obtendo a APPDATAvariável de ambiente .

Padrão C (todos os compiladores):

char* appdata = getenv("APPDATA");

Visual Studio 20xx ( evite o aviso getenv () dizendo que não é seguro ) - não no estilo Metro:

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

Impulsionar usuários : no momento em que escrevo esse boost.filesystem (que também é um rascunho da biblioteca de sistemas de arquivos proposto para o próximo padrão C ++), ainda não implementamos uma função para fornecer o diretório correto. No entanto, houve discussões sobre isso antes . Sinta-se à vontade para atualizar esta seção se as coisas mudarem.


Dados compartilhados do jogo

Windows Vista e seguintes:

C: \ ProgramData

Windows XP:

C: \ Documentos e configurações \ Todos os usuários

Você pode obter automaticamente o endereço correto obtendo a PROGRAMDATAvariável de ambiente .

Padrão C (todos os compiladores):

char* appdata = getenv("PROGRAMDATA");

Visual Studio 20xx ( evite o aviso getenv () dizendo que não é seguro ) - não no estilo Metro:

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

Impulsionar usuários : no momento em que escrevo esse boost.filesystem (que também é um rascunho da biblioteca de sistemas de arquivos proposto para o próximo padrão C ++), ainda não implementamos uma função para fornecer o diretório correto. No entanto, houve discussões sobre isso antes . Sinta-se à vontade para atualizar esta seção se as coisas mudarem.


Dados temporários do jogo

Windows Vista e seguintes:

C: \ ProgramData

Windows XP:

C: \ Documents and Settings \ {nome de usuário} \ Configurações locais \ Temp

Você pode obter automaticamente o endereço correto obtendo a TEMPvariável de ambiente .

Usuários do C ++ Boost : existe uma função boost.filesystem simples entre plataformas para esse

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

Padrão C (todos os compiladores):

char* appdata = getenv("TEMP");

Visual Studio 20xx ( evite o aviso getenv () dizendo que não é seguro ) - não no estilo Metro:

char *pValue;
size_t len;
errno_t err = _dupenv_s( &pValue, &len, "TEMP" ); 
Klaim
fonte
4
No Vista e versões posteriores, os jogos salvos devem ser preferencialmente colocados na pasta "Jogos salvos" especial. Mais informações aqui: msdn.microsoft.com/en-us/library/windows/desktop/… Procure por "FOLDERID_SavedGames"
Durza007 8/12
11
Você nunca deve tentar adivinhar o caminho sozinho ou construí-lo a partir de variáveis ​​de ambiente. No Vista e acima, você deve chamar SHGetKnownFolderPath ( msdn.microsoft.com/en-us/library/bb762188.aspx ) e, no XP e abaixo, usar SHGetFolderPath ( msdn.microsoft.com/en-us/library/bb762181.aspx )
Kylotan 08/09
@Kylotan e Durza007, estou com pouco tempo, fique à vontade para editar essa resposta conforme necessário. Fez esta resposta wiki da comunidade.
Klaim
Eu acho importante dizer que a documentação do msdn sugere o uso do SHGetKnownFolderPath, pois o SHGetFolderPath é apenas um invólucro para o novo método e é suportado apenas para compatibilidade com versões anteriores.
precisa
16

Mac OS

Baseado em:

No sistema operacional baseado em unix, o ~diretório é localizado automaticamente no diretório inicial do usuário, onde estão os dados específicos do usuário. Isso significa que, independentemente do idioma, nessas plataformas, você pode acessar automaticamente essa pasta usando, em ~vez de usar uma função específica do SO. Observe também que esse /é o caminho raiz de todo o sistema, não o caminho da raiz do disco principal.

Anexe seu próprio diretório com o nome do jogo ou a empresa do jogo e, em seguida, o nome do jogo nesses diretórios.


Dados do jogo do jogador

A orientação da Apple é localizar os arquivos de salvamento e configuração para salvá-los automaticamente na nuvem, se disponível:

~ / Documentos

No entanto, é melhor (e usado com mais frequência) localizar esses arquivos em:

~ / Biblioteca / Suporte a aplicativos /

Apenas saiba que, nesse caso, os arquivos não serão salvos automaticamente na nuvem. Se você quiser que o jogador escolha, use a API da plataforma para fazê-lo escolher.

Dados compartilhados do jogo

/ Biblioteca / Suporte a aplicativos

Observe que não existe ~, não é relativo à casa do usuário, mas à raiz do sistema.

Dados temporários do jogo:

Se os dados não precisarem ser mantidos entre as execuções:

/ tmp

Se os dados precisarem ser mantidos entre as execuções;

/ Biblioteca / Caches (para MacOSX)

Usuários do C ++ Boost : existe uma função boost.filesystem simples entre plataformas para esse

namespace bfs = boost::filesystem;
const bfs::path TEMP_DIR = bfs::system_complete( bfs::temp_directory_path() ); // system_complete() call is optional
Klaim
fonte
4
Não coloque nada ~/Documents. Isso é para o usuário escolher organizar; você nunca deve gravar em um caminho fixo dentro de documentos. Seu jogo deve ser usado ~/Library/Application Support/Your App Name/para salvar e outros dados do usuário.
Kevin Reid
@KevinReid "Os documentos que o usuário cria e vê na interface do usuário de um aplicativo - por exemplo, os navegadores de documentos em Pages, Numbers e Keynote devem ser armazenados no diretório Documents. Outro exemplo de arquivos que podem ir no diretório Documents são jogos salvos , novamente porque eles são algo que um aplicativo poderia fornecer algum tipo de método para seleção ". - Fonte: recomendação da Apple, no primeiro link. Perdi alguma coisa?
Klaim
2
Em todos esses, a ênfase está na seleção . O usuário escolhe como eles são nomeados e para onde vão. Os arquivos que o usuário não gerencia não devem ser colocados em Documents, porque Documents é o namespace do usuário, não o desenvolvedor. (Isenção de responsabilidade: não afirmo que meu conselho esteja alinhado com a documentação da Apple. Afirmo que ele reflete a maior parte da prática entre aplicativos projetados para Mac e que os usuários ficarão mais felizes com isso.)
Kevin Reid,
Além disso, não havia diretórios de "Biblioteca" no Mac OS anterior ao X. As observações “(OS X)” na documentação vinculada contrastam com o iOS , que é uma pergunta completamente diferente, pois o iOS não expõe um sistema de arquivos ao usuário.
22812 Kevin Kevin Reid
@KevinReid Vou atualizar o material da Biblioteca, obrigado. No entanto, para o que você diz sobre seleção e documentos, isso parece contraditório. Salvar jogos são relativos ao usuário, não a aplicativos ou desenvolvedores. Bem, isso depende do jogo, e é por isso que também há um diretório de dados do jogo compartilhado. Então eu não entendo exatamente o que você quer dizer. Existe algum racional em algum lugar sobre isso?
Klaim
13

Linux Debian (Ubuntu, Fedora, etc.)

Baseado em:

No sistema operacional baseado em unix, o diretório ~ é automaticamente localizado no diretório inicial do usuário, onde os dados específicos do usuário estão localizados. Isso significa que, independentemente do idioma, nessas plataformas, você pode acessar automaticamente esta pasta usando ~ em vez de usar uma função específica do SO. Observe também que / é o caminho raiz de todo o sistema, não o caminho da raiz do disco principal.

Anexe seu próprio diretório com o nome do jogo ou a empresa do jogo e, em seguida, o nome do jogo nesses diretórios.


Dados do jogo do jogador

Tradicionalmente, para o jogo Aquaria, seria:

~ / .aquaria

Observe que diretórios e arquivos iniciados com .serão ocultados por padrão para o usuário.

A maioria dos desktops agora tenta aderir à especificação XDG , que recomenda

$ XDG_CONFIG_HOME / aquários

ou

$ XDG_DATA_HOME / aquários

para configuração e savegames.

Se $XDG_CONFIG_HOMEnão estiver definido, use:

~ / .config / aquaria

ou

~ / .local / aquários

Isso ocorre principalmente para desorganizar o diretório inicial do usuário, além de permitir que os usuários executem vários perfis de um aplicativo, se acharem necessário. Existem também outros diretórios específicos do usuário dedicados na especificação.

Dados compartilhados do jogo

/ var / games /

Os arquivos de configuração compartilhados devem estar localizados em

/ etc / jogos /

Dados temporários do jogo

/ tmp

Klaim
fonte
11
Para elaborar: um jogo "Aquaria" deve colocar os dados do jogo em ~ / .aquaria (ou ~ / .config / Aquaria). É desagradável ter um diretório gravável em todo o mundo em / var; a maneira geral de fazer isso acontecer é criar uma conta de usuário para o seu jogo e torná-la a única conta que pode gravar nesse diretório (e depois usar setuid quando pessoas normais estiverem jogando). Isso pode ser mais trabalho do que você deseja.
dhasenan
Bem, na verdade, a maioria das áreas de trabalho agora tenta aderir à especificação XDG, que recomenda $ XDG_CONFIG_HOME / aquaria (ou ~ / .config / aquaria se não estiver definido) e $ XDG_DATA_HOME / aquaria (ou ~ / .local / aquaria) para configuração e savegames (em vez disso, consulte standards.freedesktop.org/basedir-spec/basedir-spec-latest.html ). Isso ocorre principalmente para desorganizar o diretório inicial do usuário, além de permitir que os usuários executem vários perfis de um aplicativo, se acharem necessário. Existem também outros diretórios específicos do usuário dedicados na especificação.
liori
@ioriori Atualizarei as respostas amanhã, se encontrar tempo, desculpe pelo atraso. Se você quiser e tiver tempo, sinta-se à vontade para atualizar as informações. É útil para mim também.
Klaim