Di direktori mana untuk menulis game menyimpan file / data?

37

Saya membutuhkan daftar direktori yang pasti, satu atau lebih per platform, tempat menyimpan game, menyimpan file, dan data game lainnya yang dihasilkan . Baik berdasarkan spesifikasi pengembang OS, atau karena itu adalah penggunaan umum jika tidak ada rekomendasi.

Harap berikan satu jawaban per platform , dengan direktori yang berbeda. Juga, contoh cara mendapatkan lokasi direktori di C ++ atau C adalah yang terbaik , karena bahasa yang Anda gunakan akan lebih sulit.

Lokasi:

  • Data permainan pemain (game tersimpan, konfigurasi).
  • Data permainan bersama (seperti skor tinggi atau konfigurasi untuk semua pengguna komputer).
  • Data permainan sementara (alias direktori cache).
Klaim
sumber
1
Anda mungkin harus memasukkan semua jawaban menjadi satu, karena tidak ada jawaban tunggal untuk diterima?
Zolomon
@ Zolomon Masalahnya adalah bahwa satu jawaban dengan semua platform akan terlalu besar, saya pikir. Khususnya jika Anda menambahkan platform seluler / tablet ...
Klaim
mungkin perlu dicatat (karena mungkin ada lebih banyak yang berbagi pendapat ini) bahwa setidaknya saya benci ketika game tidak menyelamatkan ke direktori (instal) hormat mereka. Saya suka game di mana pengguna dalam game dibuat dalam game, dan tidak perlu lagi bersembunyi: PC yang saya gunakan untuk bermain game tidak pernah multi-pengguna cukup untuk menggunakan pengguna OS sama sekali. Atau jika harus menggunakannya, saya suka game yang melakukannya secara internal. Mungkin bukan itu masalahnya, tetapi: gagasan tentang satu pengguna OS = satu potong permainan pengguna alterego juga menyedihkan. perhatikan saya seorang windows gamer. pada * unix itu berbeda, FS tetap memaksa konsep (tidak ada drive)
n611x007
@naxa Jika itu bisa "menghibur" Anda, saya membuat game yang memiliki manajemen akun pemain di dalamnya, tetapi akun pemain masih harus disimpan di akun pengguna karena alasan keamanan OS. Saya mungkin menyimpannya dalam repo bersama juga, tidak yakin. Juga, saya harus mengizinkan pengguna untuk menyimpan data online di beberapa titik.
Klaim
3
@naxa Masalahnya adalah bahwa pada Vista, Windows7, Windows8, kecuali dijalankan secara khusus sebagai administrator, program tidak dapat menulis ke Program Files \ Game-Install-Dir \. Saya percaya ini berlaku pada versi Linux dan OSX yang lebih baru juga.
Nate

Jawaban:

23

Windows (Xp dan berikut)

Berdasarkan:

Lokasi-lokasi ini menganggap bahwa Windows diinstal pada disk C :. Tambahkan direktori Anda sendiri dengan nama game atau perusahaan game lalu nama game ke direktori ini.


Jika Anda menggunakan aplikasi Metro-style Window 8 , Anda harus menggunakan API khusus alih-alih mencoba menjangkau direktori. Baca baca:


Data permainan pemain

Windows Vista dan berikut ini:

C: \ Users \ {username} \ AppData \ Roaming

Windows Xp:

C: \ Documents and Settings \ {username} \ Data Aplikasi

Anda dapat secara otomatis mendapatkan alamat yang bergantung pada nama pengguna dengan mendapatkan APPDATAvariabel lingkungan .

Standar C (semua kompiler):

char* appdata = getenv("APPDATA");

Visual Studio 20xx ( hindari getenv () peringatan yang mengatakan itu tidak aman ) - non Metro Style:

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

Tingkatkan pengguna : saat ini saya menulis boost.filesystem ini (yang juga merupakan konsep pustaka sistem berkas yang diusulkan ke standar C ++ berikutnya) belum mengimplementasikan fungsi untuk menyediakan direktori yang benar. Namun, ada diskusi tentang ini sebelumnya . Silakan memperbarui bagian ini jika ada perubahan.


Data game bersama

Windows Vista dan berikut ini:

C: \ ProgramData

Windows Xp:

C: \ Documents and Settings \ All Users

Anda dapat secara otomatis mendapatkan alamat yang benar dengan mendapatkan PROGRAMDATAvariabel lingkungan .

Standar C (semua kompiler):

char* appdata = getenv("PROGRAMDATA");

Visual Studio 20xx ( hindari getenv () peringatan yang mengatakan itu tidak aman ) - non Metro Style:

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

Tingkatkan pengguna : saat ini saya menulis boost.filesystem ini (yang juga merupakan konsep pustaka sistem berkas yang diusulkan ke standar C ++ berikutnya) belum mengimplementasikan fungsi untuk menyediakan direktori yang benar. Namun, ada diskusi tentang ini sebelumnya . Silakan memperbarui bagian ini jika ada perubahan.


Data game sementara

Windows Vista dan berikut ini:

C: \ ProgramData

Windows Xp:

C: \ Documents and Settings \ {username} \ Local Settings \ Temp

Anda dapat secara otomatis mendapatkan alamat yang benar dengan mendapatkan TEMPvariabel lingkungan .

C ++ Tingkatkan pengguna : ada fungsi boost.files sistem lintas platform sederhana untuk ini

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

Standar C (semua kompiler):

char* appdata = getenv("TEMP");

Visual Studio 20xx ( hindari getenv () peringatan yang mengatakan itu tidak aman ) - non Metro Style:

char *pValue;
size_t len;
errno_t err = _dupenv_s( &pValue, &len, "TEMP" ); 
Klaim
sumber
4
Pada Vista dan ke atas, permainan menyimpan sebaiknya ditempatkan di folder "Permainan tersimpan" khusus. Info lebih lanjut di sini: msdn.microsoft.com/en-us/library/windows/desktop/… Cari "FOLDERID_SavedGames"
Durza007
1
Anda seharusnya tidak mencoba menebak jalannya sendiri atau membangunnya dari variabel lingkungan, sungguh. Pada Vista dan di atas, Anda harus menghubungi SHGetKnownFolderPath ( msdn.microsoft.com/en-us/library/bb762188.aspx ) dan di XP dan di bawah ini gunakan SHGetFolderPath ( msdn.microsoft.com/en-us/library/bb762181.aspx )
Kylotan
@Kylotan dan Durza007, saya sedikit kekurangan waktu, silakan mengedit jawaban ini seperlunya. Menjadikan wiki komunitas jawaban ini.
Klaim
Saya pikir penting untuk mengatakan bahwa dokumentasi msdn menyarankan menggunakan SHGetKnownFolderPath karena SHGetFolderPath hanyalah pembungkus untuk metode baru dan hanya didukung untuk kompatibilitas mundur.
Kagemusha
16

MacOS

Berdasarkan:

Dalam OS berbasis unix, ~direktori secara otomatis terletak di direktori home pengguna di mana data spesifik pengguna berada. Ini berarti apa pun bahasanya, pada platform ini Anda dapat mengakses folder ini secara otomatis dengan menggunakan ~alih-alih menggunakan fungsi spesifik OS. Perhatikan juga bahwa /path root dari keseluruhan sistem, bukan path ke root dari disk utama.

Tambahkan direktori Anda sendiri dengan nama game atau perusahaan game lalu nama game ke direktori ini.


Data permainan pemain

Pedoman Apple adalah menemukan lokasi penyimpanan dan konfigurasi file di sana untuk membuatnya disimpan secara otomatis di cloud jika tersedia:

~ / Dokumen

Namun, lebih baik (dan lebih sering digunakan) praktik untuk menemukan file-file ini di:

~ / Perpustakaan / Dukungan Aplikasi /

Ketahuilah bahwa dalam hal ini file tidak akan disimpan secara otomatis ke cloud. Jika Anda ingin pemain memilih, gunakan API platform untuk membuatnya memilih.

Data game bersama

/ Dukungan Perpustakaan / Aplikasi

Perhatikan bahwa tidak ada ~, itu tidak relatif ke rumah pengguna tetapi ke root sistem.

Data permainan sementara:

Jika data tidak perlu disimpan di antara eksekusi:

/ tmp

Jika data perlu disimpan di antara eksekusi;

/ Perpustakaan / Tembolok (untuk MacOSX)

C ++ Tingkatkan pengguna : ada fungsi boost.files sistem lintas platform sederhana untuk ini

namespace bfs = boost::filesystem;
const bfs::path TEMP_DIR = bfs::system_complete( bfs::temp_directory_path() ); // system_complete() call is optional
Klaim
sumber
4
Jangan letakkan apapun di dalamnya ~/Documents. Itu bagi pengguna untuk memilih mengatur; Anda tidak boleh menulis ke jalur tetap di dalam Dokumen. Game Anda harus digunakan ~/Library/Application Support/Your App Name/untuk menyimpan dan data pengguna lainnya.
Kevin Reid
@KevinReid "Dokumen yang dibuat dan dilihat pengguna di antarmuka pengguna aplikasi — misalnya browser dokumen di Pages, Numbers, dan Keynote harus disimpan di direktori Documents. Contoh lain dari file yang mungkin masuk dalam direktori Documents adalah permainan yang disimpan , sekali lagi karena mereka adalah sesuatu yang berpotensi aplikasi menyediakan semacam metode untuk memilih. " - Sumber: Rekomendasi Apple, di tautan pertama. Apakah saya melewatkan sesuatu?
Klaim
2
Dalam semua itu penekanannya adalah pada pemilihan . Pengguna memilih nama mereka dan ke mana mereka pergi. File yang tidak dikelola pengguna tidak boleh ditempatkan dalam Dokumen, karena Dokumen adalah ruang nama pengguna, bukan milik pengembang. (Penafian: Saya tidak mengklaim bahwa saran saya selaras dengan dokumentasi Apple. Saya mengklaim bahwa itu mencerminkan sebagian besar praktik di antara aplikasi yang dirancang untuk Mac dan bahwa pengguna akan lebih bahagia dengan itu.)
Kevin Reid
Juga, tidak ada direktori "Library" di pra-X Mac OS. Pernyataan “(OS X)” dalam dokumentasi yang terhubung kontras dengan iOS , yang merupakan pertanyaan yang sama sekali berbeda karena iOS tidak mengekspos sistem file kepada pengguna.
Kevin Reid
@KevinReid saya akan memperbarui hal-hal Perpustakaan, terima kasih. Namun untuk apa yang Anda katakan tentang pemilihan dan Dokumen, ini tampaknya bertentangan. Menyimpan game adalah relatif pengguna, bukan aplikasi atau relatif pengembang. Yah itu tergantung pada gim, itulah sebabnya ada juga direktori data gim yang dibagikan. Jadi saya tidak mengerti apa maksud Anda sebenarnya. Adakah yang rasional tentang hal itu?
Klaim
13

Linux Debian (Ubuntu, Fedora, dll.)

Berdasarkan:

Dalam OS berbasis unix, direktori ~ secara otomatis terletak di direktori home pengguna di mana data spesifik pengguna berada. Ini berarti apa pun bahasanya, pada platform ini Anda dapat mengakses folder ini secara otomatis dengan menggunakan ~ alih-alih menggunakan fungsi spesifik OS. Perhatikan juga bahwa / adalah path root dari keseluruhan sistem, bukan path ke root dari disk utama.

Tambahkan direktori Anda sendiri dengan nama game atau perusahaan game lalu nama game ke direktori ini.


Data permainan pemain

Secara tradisional, untuk game Aquaria adalah:

~ / .aquaria

Perhatikan bahwa direktori dan file yang dimulai dengan .akan disembunyikan secara default kepada pengguna.

Sebagian besar desktop sekarang mencoba mematuhi spesifikasi XDG , yang direkomendasikan

$ XDG_CONFIG_HOME / aquaria

atau

$ XDG_DATA_HOME / aquaria

untuk konfigurasi dan savegames sebagai gantinya.

Jika $XDG_CONFIG_HOMEtidak disetel gunakan:

~ / .config / aquaria

atau

~ / .local / aquaria

Ini sebagian besar untuk mengacaukan direktori home pengguna, serta memungkinkan pengguna untuk menjalankan beberapa profil aplikasi jika mereka menganggapnya perlu. Ada juga direktori khusus pengguna khusus lainnya dalam spesifikasi.

Data game bersama

/ var / game /

File konfigurasi bersama harus berlokasi di

/ etc / games /

Data game sementara

/ tmp

Klaim
sumber
1
Untuk menguraikan: gim "Aquaria" harus memasukkan data gimnya ke ~ / .aquaria (atau ~ / .config / Aquaria). Tidak disukai memiliki direktori yang bisa ditulis dunia di / var; cara umum untuk mewujudkannya adalah dengan membuat akun pengguna untuk gim Anda dan menjadikannya satu-satunya akun yang dapat menulis ke direktori itu (dan kemudian menggunakan setuid ketika orang normal sedang memainkan gim). Ini mungkin lebih banyak pekerjaan daripada yang Anda inginkan.
dhasenan
Sebenarnya, sebagian besar desktop sekarang mencoba mematuhi spesifikasi XDG, yang merekomendasikan $ XDG_CONFIG_HOME / aquaria (atau ~ / .config / aquaria jika tidak disetel) dan $ XDG_DATA_HOME / aquaria (atau ~ / .local / aquaria) untuk konfigurasi dan savegames sebagai gantinya (lihat standards.freedesktop.org/basedir-spec/basedir-spec-latest.html ). Ini sebagian besar untuk mengacaukan direktori home pengguna, serta memungkinkan pengguna untuk menjalankan beberapa profil aplikasi jika mereka menganggapnya perlu. Ada juga direktori khusus pengguna khusus lainnya dalam spesifikasi.
liori
@liori saya akan memperbarui jawaban besok jika saya dapat menemukan waktu, maaf atas keterlambatannya. Jika Anda merasa suka dan punya waktu, jangan ragu untuk memperbarui informasinya. Ini berguna bagi saya juga.
Klaim