In welchem ​​Verzeichnis soll das Spiel speichern Dateien / Daten schreiben?

37

Ich benötige eine definitive Liste von Verzeichnissen, eines oder mehrere pro Plattform, in denen sich gespeicherte Spieledateien und andere vom Spiel generierte Daten befinden . Entweder basierend auf der Betriebssystem-Entwicklerspezifikation oder weil es üblich ist, wenn es keine Empfehlung gibt.

Bitte geben Sie eine Antwort pro Plattform mit unterschiedlichen Verzeichnissen an. Ein Beispiel für das Abrufen des Verzeichnispfads in C ++ oder C ist ebenfalls am besten , da dies die Sprache ist, die Ihnen schwerer fällt.

Standorte:

  • Spieldaten des Spielers (gespeicherte Spiele, Konfiguration).
  • Geteilte Spieldaten (wie Highscore oder Konfiguration für alle Computerbenutzer).
  • Temporäre Spieldaten (auch Cache-Verzeichnis genannt).
Klaim
quelle
1
Sie sollten wahrscheinlich alle Antworten in einer Antwort zusammenfassen, da keine einzige Antwort zu akzeptieren ist.
Zolomon
@Zolomon Das Problem ist, dass eine Antwort mit allen Plattformen meiner Meinung nach zu groß sein wird. Insbesondere, wenn Sie mobile / Tablet-Plattformen hinzufügen ...
Klaim
Es mag erwähnenswert sein (da es vielleicht mehr gibt, die diese Meinung teilen), dass ich es zumindest hasse, wenn Spiele nicht in ihren respektvollen (Installations-) Verzeichnissen gespeichert werden. Ich mag Spiele, bei denen In-Game-Benutzer im Spiel erstellt werden und kein Verstecken mehr erforderlich ist: Die PCs, die ich zum Spielen verwende, sind niemals für mehrere Benutzer geeignet, um die Betriebssystembenutzer überhaupt zu verwenden. Oder wenn es es verwenden muss, mag ich Spiele, die es intern tun. Das mag nicht der Fall sein, aber: Die Vorstellung von einem Betriebssystembenutzer = einem Teil des Spielbenutzer-Alterego ist auch bedrückend. Ich bin ein Windows-Spieler. Unter * Unix ist es anders, der feste FS erzwingt das Konzept (es gibt keine Laufwerke)
n611x007
@naxa Wenn das dich "trösten" kann, mache ich ein Spiel, das eine Spielerkontoverwaltung enthält, aber das Spielerkonto muss aus Gründen der Betriebssystemsicherheit noch im Benutzerkonto gespeichert werden. Ich könnte sie auch in Shared Repo speichern, nicht sicher. Außerdem muss ich den Benutzern erlauben, Daten irgendwann online zu halten.
Klaim
3
@naxa Das Problem ist, dass unter Vista, Windows7 und Windows8 die Programme, sofern sie nicht speziell als Administrator ausgeführt werden, nicht in das Verzeichnis Programme \ Spiel-Installationsverzeichnis \ schreiben können. Ich glaube, dass dies auch für neuere Linux- und OSX-Versionen gilt.
Nate

Antworten:

23

Windows (XP und folgende)

Beyogen auf:

Diese Speicherorte setzen voraus, dass Windows auf dem Datenträger C: installiert ist. Fügen Sie in diese Verzeichnisse Ihr eigenes Verzeichnis mit dem Namen des Spiels oder der Spielefirma und anschließend den Namen des Spiels ein.


Wenn Sie eine Windows 8-Anwendung im Metro-Stil verwenden , müssen Sie eine bestimmte API verwenden, anstatt zu versuchen, auf Verzeichnisse zuzugreifen. Lesen:


Spieldaten des Spielers

Windows Vista und folgende:

C: \ Benutzer \ {Benutzername} \ AppData \ Roaming

Windows XP:

C: \ Dokumente und Einstellungen \ {Benutzername} \ Anwendungsdaten

Sie können automatisch die richtige benutzernamenabhängige Adresse ermitteln, indem Sie die APPDATAUmgebungsvariable abrufen .

Standard C (alle Compiler):

char* appdata = getenv("APPDATA");

Visual Studio 20xx ( vermeiden Sie die Warnung getenv (), die besagt, dass es nicht sicher ist ) - Nicht-Metro-Stil:

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

Boost-Benutzer : Im Moment schreibe ich dieses boost.filesystem (das auch ein Entwurf der Dateisystembibliothek ist, die für den nächsten C ++ - Standard vorgeschlagen wurde) und implementiert noch keine Funktion, um das richtige Verzeichnis bereitzustellen. Allerdings gibt es Diskussionen , bevor darüber . Bitte aktualisieren Sie diesen Abschnitt, wenn sich etwas ändert.


Freigegebene Spieldaten

Windows Vista und folgende:

C: \ ProgramData

Windows XP:

C: \ Dokumente und Einstellungen \ Alle Benutzer

Sie können automatisch die richtige Adresse ermitteln, indem Sie die PROGRAMDATAUmgebungsvariable abrufen .

Standard C (alle Compiler):

char* appdata = getenv("PROGRAMDATA");

Visual Studio 20xx ( vermeiden Sie die Warnung getenv (), die besagt, dass es nicht sicher ist ) - Nicht-Metro-Stil:

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

Boost-Benutzer : Im Moment schreibe ich dieses boost.filesystem (das auch ein Entwurf der Dateisystembibliothek ist, die für den nächsten C ++ - Standard vorgeschlagen wurde) und implementiert noch keine Funktion, um das richtige Verzeichnis bereitzustellen. Allerdings gibt es Diskussionen , bevor darüber . Bitte aktualisieren Sie diesen Abschnitt, wenn sich etwas ändert.


Temporäre Spieldaten

Windows Vista und folgende:

C: \ ProgramData

Windows XP:

C: \ Dokumente und Einstellungen \ {Benutzername} \ Lokale Einstellungen \ Temp

Sie können automatisch die richtige Adresse ermitteln, indem Sie die TEMPUmgebungsvariable abrufen .

C ++ Boost - Benutzer : Es gibt eine einfache plattformübergreifende Boost.Filesystem Funktion für diese

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

Standard C (alle Compiler):

char* appdata = getenv("TEMP");

Visual Studio 20xx ( vermeiden Sie die Warnung getenv (), die besagt, dass es nicht sicher ist ) - Nicht-Metro-Stil:

char *pValue;
size_t len;
errno_t err = _dupenv_s( &pValue, &len, "TEMP" ); 
Klaim
quelle
4
Unter Vista und höher sollten Spielspeicherungen vorzugsweise im speziellen Ordner "Gespeicherte Spiele" abgelegt werden. Weitere Informationen finden Sie hier: msdn.microsoft.com/en-us/library/windows/desktop/… Suchen Sie nach "FOLDERID_SavedGames"
Durza007
1
Sie sollten niemals versuchen, den Pfad selbst zu erraten oder ihn aus Umgebungsvariablen zu konstruieren. Unter Vista und höher sollten Sie SHGetKnownFolderPath ( msdn.microsoft.com/en-us/library/bb762188.aspx ) aufrufen und unter XP und niedriger SHGetFolderPath ( msdn.microsoft.com/en-us/library/bb762181.aspx ) verwenden.
Kylotan
@Kylotan und Durza007, mir fehlt die Zeit. Bitte bearbeiten Sie diese Antwort nach Bedarf. Hat dieses Antwort-Community-Wiki erstellt.
Klaim
Ich denke, es ist wichtig zu sagen, dass die msdn-Dokumentation die Verwendung von SHGetKnownFolderPath vorschlägt, da SHGetFolderPath nur ein Wrapper für die neue Methode ist und nur aus Gründen der Abwärtskompatibilität unterstützt wird.
Kagemusha
16

Mac OS

Beyogen auf:

Unter Unix-basierten Betriebssystemen befindet sich das ~Verzeichnis automatisch im Ausgangsverzeichnis des Benutzers, in dem sich benutzerspezifische Daten befinden. Dies bedeutet, dass Sie auf diesen Plattformen unabhängig von der Sprache automatisch auf diesen Ordner zugreifen können, indem Sie ~anstelle einer betriebssystemspezifischen Funktion verwenden. Beachten Sie auch, dass dies /der Stammpfad des gesamten Systems ist und nicht der Pfad zum Stamm der Hauptfestplatte.

Fügen Sie in diese Verzeichnisse Ihr eigenes Verzeichnis mit dem Namen des Spiels oder der Spielefirma und anschließend den Namen des Spiels ein.


Spieldaten des Spielers

Die Apple-Richtlinie lautet: Suchen Sie dort nach Speicher- und Konfigurationsdateien, damit diese, sofern verfügbar, automatisch in der Cloud gespeichert werden.

~ / Dokumente

Es ist jedoch besser (und wird häufiger verwendet), diese Dateien zu finden in:

~ / Bibliothek / Anwendungsunterstützung /

Beachten Sie, dass in diesem Fall die Dateien nicht automatisch in der Cloud gespeichert werden. Wenn Sie möchten, dass der Player eine Auswahl trifft, verwenden Sie die API der Plattform, um ihn zur Auswahl zu bringen.

Freigegebene Spieldaten

/ Bibliothek / Anwendungsunterstützung

Beachten Sie, dass dies nicht der Fall ist ~. Es bezieht sich nicht auf das Haus des Benutzers, sondern auf das Stammverzeichnis des Systems.

Temporäre Spieldaten:

Wenn die Daten zwischen den Ausführungen nicht aufbewahrt werden müssen:

/ tmp

Wenn die Daten zwischen den Ausführungen aufbewahrt werden müssen;

/ Library / Caches (für MacOSX)

C ++ Boost - Benutzer : Es gibt eine einfache plattformübergreifende Boost.Filesystem Funktion für diese

namespace bfs = boost::filesystem;
const bfs::path TEMP_DIR = bfs::system_complete( bfs::temp_directory_path() ); // system_complete() call is optional
Klaim
quelle
4
Legen Sie nichts hinein ~/Documents. Das ist für den Benutzer zu organisieren; Sie sollten niemals in Dokumente auf einen festen Pfad schreiben. Ihr Spiel sollte ~/Library/Application Support/Your App Name/für Spielstände und andere Benutzerdaten verwendet werden.
Kevin Reid
@KevinReid "Dokumente, die der Benutzer erstellt und in der Benutzeroberfläche einer App anzeigt, z. B. die Dokumentbrowser in Pages, Numbers und Keynote, sollten im Verzeichnis Documents gespeichert werden. Ein weiteres Beispiel für Dateien, die sich möglicherweise im Verzeichnis Documents befinden, sind gespeicherte Spiele Dies ist wiederum darauf zurückzuführen, dass eine App möglicherweise eine Methode zur Auswahl bietet. " - Quelle: Apples Empfehlung, im ersten Link. Habe ich etwas verpasst?
Klaim
2
Bei all diesen liegt der Schwerpunkt auf der Auswahl . Der Benutzer wählt, wie er heißt und wohin er geht. Dateien, die der Benutzer nicht verwaltet, sollten nicht in Documents abgelegt werden, da Documents der Namespace des Benutzers und nicht der des Entwicklers ist. (Haftungsausschluss: Ich behaupte nicht, dass mein Rat mit der Dokumentation von Apple in Einklang steht. Ich behaupte, dass er den Großteil der Praxis unter Anwendungen widerspiegelt, die für Mac entwickelt wurden, und dass Benutzer damit zufriedener sind.)
Kevin Reid
Außerdem gab es unter Mac OS vor X keine Bibliotheksverzeichnisse. Die "(OS X)" - Bemerkungen in der verlinkten Dokumentation stehen im Gegensatz zu iOS , was eine völlig andere Frage ist, da iOS dem Benutzer kein Dateisystem zur Verfügung stellt.
Kevin Reid
@ KevinReid Ich werde das Bibliotheksmaterial aktualisieren, danke. Was Sie jedoch zur Auswahl und zu Dokumenten sagen, scheint widersprüchlich zu sein. Save Games sind benutzerbezogen, nicht anwendungs- oder entwicklerbezogen. Nun, es kommt auf das Spiel an, weshalb es auch ein gemeinsames Spieldatenverzeichnis gibt. Also verstehe ich nicht, was du genau meinst. Gibt es irgendwo einen Grund dafür?
Klaim,
13

Linux Debian (Ubuntu, Fedora usw.)

Beyogen auf:

Unter Unix-basierten Betriebssystemen befindet sich das Verzeichnis ~ automatisch im Ausgangsverzeichnis des Benutzers, in dem sich benutzerspezifische Daten befinden. Dies bedeutet, dass Sie auf diesen Plattformen unabhängig von der Sprache automatisch auf diesen Ordner zugreifen können, indem Sie ~ anstelle einer betriebssystemspezifischen Funktion verwenden. Beachten Sie auch, dass / der Stammpfad des gesamten Systems ist und nicht der Pfad zum Stamm der Hauptfestplatte.

Fügen Sie in diese Verzeichnisse Ihr eigenes Verzeichnis mit dem Namen des Spiels oder der Spielefirma und anschließend den Namen des Spiels ein.


Spieldaten des Spielers

Für das Spiel Aquaria wäre es traditionell:

~ / .aquaria

Beachten Sie, dass Verzeichnisse und Dateien, die mit beginnen ., dem Benutzer standardmäßig verborgen bleiben.

Die meisten Desktops versuchen nun, sich an die empfohlene XDG-Spezifikation zu halten

$ XDG_CONFIG_HOME / aquaria

oder

$ XDG_DATA_HOME / aquaria

stattdessen für Konfiguration und Spielstände.

Wenn $XDG_CONFIG_HOMEnicht gesetzt, verwenden Sie:

~ / .config / aquaria

oder

~ / .local / aquaria

Dies geschieht hauptsächlich, um das Home-Verzeichnis des Benutzers freizugeben und den Benutzern zu ermöglichen, mehrere Profile einer Anwendung auszuführen, wenn sie dies für erforderlich halten. Es gibt auch andere dedizierte benutzerspezifische Verzeichnisse in der Spezifikation.

Freigegebene Spieldaten

/ var / games /

Freigegebene Konfigurationsdateien sollten sich in befinden

/ etc / games /

Temporäre Spieldaten

/ tmp

Klaim
quelle
1
Um es auszuarbeiten: Ein Spiel "Aquaria" sollte seine Spieldaten in ~ / .aquaria (oder ~ / .config / Aquaria) ablegen. Es ist verpönt, ein von der Welt beschreibbares Verzeichnis in / var zu haben. Die allgemeine Möglichkeit besteht darin, ein Benutzerkonto für Ihr Spiel zu erstellen und es zum einzigen Konto zu machen, das in dieses Verzeichnis schreiben kann (und dann setuid zu verwenden, wenn normale Leute das Spiel spielen). Dies könnte mehr Arbeit sein, als Sie wollen.
Dhasenan
Tatsächlich versuchen die meisten Desktops jetzt, die XDG-Spezifikation einzuhalten, die für die Konfiguration und die Verwendung $ XDG_CONFIG_HOME / aquaria (oder ~ / .config / aquaria, falls nicht festgelegt) und $ XDG_DATA_HOME / aquaria (oder ~ / .local / aquaria) empfiehlt Stattdessen Savegames (siehe standards.freedesktop.org/basedir-spec/basedir-spec-latest.html ). Dies geschieht hauptsächlich, um das Basisverzeichnis des Benutzers freizugeben und den Benutzern zu ermöglichen, mehrere Profile einer Anwendung auszuführen, wenn sie dies für erforderlich halten. Es gibt auch andere dedizierte benutzerspezifische Verzeichnisse in der Spezifikation.
Liori
@liori Ich werde die Antworten morgen aktualisieren, wenn ich Zeit finde, entschuldige die Verzögerung. Wenn Sie Lust und Zeit haben, können Sie die Informationen jederzeit aktualisieren. Es ist auch für mich nützlich.
Klaim