Hangi dizinde oyun yazmak için dosya / veri kaydetmek?


37

Oyun kaydetme dosyalarının ve diğer oyunların ürettiği verilerin nereye koyacağına, platform başına bir veya daha fazla kesin bir dizin listesine ihtiyacım var . İşletim sistemi geliştiricisinin teknik özelliklerine göre veya öneri yoksa, genel kullanım olduğu için.

Lütfen farklı dizinlerle, platform başına bir cevap verin . Ayrıca, dizin konumunu C ++ veya C ile nasıl alacağınıza dair örnek en iyisidir , çünkü daha zor zamanlar geçireceğiniz dildir.

yerler:

  • Oyuncunun oyun verileri (kaydedilmiş oyunlar, config).
  • Paylaşılan oyun verileri (tüm bilgisayar kullanıcıları için yüksek puan veya yapılandırma gibi).
  • Geçici oyun verileri (aka önbellek dizini).

1
Muhtemelen tüm cevapları bir araya getirmelisin, çünkü kabul edilecek tek bir cevap yok?
Zolomon

@Zolomon Sorun şu ki, tüm platformlara verilen bir cevap bence çok büyük olacak. Özellikle eğer mobil / tablet platformları eklerseniz ...
Klaim

En azından oyunların saygılı (kurulum) dizinlerine girmediğinden nefret etmemden nefret ediyorum (bu görüşü paylaşan daha fazla kişi olabilir). Oyun içi kullanıcıların oyun içinde yaratıldığı oyunları seviyorum ve artık saklanmaya gerek yok: Oyun oynamak için kullandığım bilgisayarlar hiçbir zaman işletim sistemi kullanıcılarını kullanabilecek kadar çok kullanıcılı değil. Ya da kullanması gerekiyorsa, dahili olarak yapan oyunları severim. Durum böyle olmayabilir, ama: bir işletim sistemi kullanıcısı fikri = bir kullanıcı oyun alternatifi parçası da üzücü. Ben bir Windows oyuncusuyum. * unix durum farklı, sabit FS kuvvetleri kavramı (hayır sürücüler vardır)
n611x007

@ naxa Eğer bu sizi “teselli” edebilirse, içeride oyuncu hesabı yönetimi olan bir oyun yapıyorum, ancak oyuncu güvenliği hesabının işletim sistemi güvenliği nedeniyle kullanıcının hesabında saklanması gerekiyor. Onları paylaşılan depoda da saklayabilirim, emin değilim. Ayrıca, kullanıcıların bir noktada çevrimiçi veri tutmalarına izin vermem gerekecek.
Klaim

3
@naxa Sorun, Vista, Windows7, Windows8'de, özellikle yönetici olarak çalıştırılmadıkça, programların Program Files \ Game-Install-Dir \ dizinine yazamayacaklarıdır. Bunun daha yeni Linux ve OSX versiyonlarında da geçerli olduğuna inanıyorum.
Nate

Yanıtlar:


23

Windows (Xp ve devam ediyor)

Dayalı:

Bu konumlar, Windows'un C: diskine yüklendiğini varsayar. Bu dizine oyun veya oyun şirketi ile kendi dizini ekleyiniz.


Window 8 Metro tarzı bir uygulama kullanıyorsanız , dizinlere ulaşmaya çalışmak yerine belirli bir API kullanmanız gerekir. oku:


Oyuncunun oyun verileri

Windows Vista ve aşağıdakiler:

C: \ Kullanıcılar \ {adı} \ AppData \ Roaming

Windows XP:

C: \ Belgeler ve Ayarlar \ {kullanıcı adı} \ Uygulama Verileri

APPDATAOrtam değişkenini alarak doğru kullanıcı adına bağlı adresi otomatik olarak alabilirsiniz .

Standart C (tüm derleyiciler):

char* appdata = getenv("APPDATA");

Visual Studio 20xx ( getenv ( önlemek) uyarısı güvenli değildir ) - Metro Stili:

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

Kullanıcıları destekleyin : Şu anda bu boost.filesystem (şu anda bir sonraki C ++ standardına önerilen bir dosya sistemi kütüphanesi taslağı) yazıyorum. Ancak, bu konuda daha önce tartışmalar yapılmıştı . Lütfen bir şeyler değiştiğinde bu bölümü güncellemekten çekinmeyin.


Paylaşılan oyun verileri

Windows Vista ve aşağıdakiler:

C: \ ProgramData'nın

Windows XP:

C: \ Belgeler ve Ayarlar \ Tüm Kullanıcılar

PROGRAMDATAOrtam değişkenini alarak doğru adresi otomatik olarak alabilirsiniz .

Standart C (tüm derleyiciler):

char* appdata = getenv("PROGRAMDATA");

Visual Studio 20xx ( getenv ( önlemek) uyarısı güvenli değildir ) - Metro Stili:

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

Kullanıcıları destekleyin : Şu anda bu boost.filesystem (şu anda bir sonraki C ++ standardına önerilen bir dosya sistemi kütüphanesi taslağı) yazıyorum. Ancak, bu konuda daha önce tartışmalar yapılmıştı . Lütfen bir şeyler değiştiğinde bu bölümü güncellemekten çekinmeyin.


Geçici oyun verileri

Windows Vista ve aşağıdakiler:

C: \ ProgramData'nın

Windows XP:

C: \ Belgeler ve Ayarlar \ {kullanıcı adı} \ Yerel Ayarlar \ Temp

TEMPOrtam değişkenini alarak doğru adresi otomatik olarak alabilirsiniz .

C ++ Boost kullanıcıları : orada basit bir çapraz platform boost.filesystem fonksiyonu bunun için

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

Standart C (tüm derleyiciler):

char* appdata = getenv("TEMP");

Visual Studio 20xx ( getenv ( önlemek) uyarısı güvenli değildir ) - Metro Stili:

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

4
Vista ve üzeri sürümlerde, özel "Kayıtlı oyunlar" klasörüne oyun tasarrufları tercih edilmelidir. Burada daha fazla bilgi: msdn.microsoft.com/en-us/library/windows/desktop/... "FOLDERID_SavedGames" için bak
Durza007

1
Asla yolu kendiniz tahmin etmeye veya çevre değişkenlerinden oluşturmaya çalışmamalısınız. Vista ve üzeri sürümlerde, SHGetKnownFolderPath ( msdn.microsoft.com/en-us/library/bb762188.aspx ) ve XP’de ve aşağıda SHGetFolderPath ( msdn.microsoft.com/en-us/library/bb762181.aspx ) adresini kullanmalısınız.
Kylotan

@Kylotan ve Durza007, zamanında biraz kısayım, bu cevabı gerektiği gibi düzenlemek için çekinmeyin. Bu cevabı topluluk wiki yaptı.
Klaim

Msdn belgelerinin SHGetKnownFolderPath'i kullanmasını önerdiğini söylemenin önemli olduğunu düşünüyorum çünkü SHGetFolderPath yeni yöntem için yalnızca bir sarıcı ve yalnızca geriye dönük uyumluluk için destekleniyor.
Kagemusha

16

Mac os işletim sistemi

Dayalı:

Unix tabanlı işletim sistemlerinde, ~dizin otomatik olarak kullanıcıya özel verilerin bulunduğu kullanıcının ana dizininde bulunur. Bu, dil ne olursa olsun, bu platformlarda ~işletim sistemine özgü bir işlev kullanmak yerine bu klasöre otomatik olarak erişebileceğiniz anlamına gelir . Ayrıca /, tüm sistemin kök yolu olduğunu, ana diskin kökünün yolu olmadığını unutmayın .

Bu dizine oyun veya oyun şirketi ile kendi dizini ekleyiniz.


Oyuncunun oyun verileri

Apple'ın yönergesi, mevcutsa bulutta otomatik olarak kaydedilmelerini sağlamak için kaydetme ve yapılandırma dosyalarını bulmaktır:

~ / Belgeler

Ancak, bu dosyaları bulmak daha iyi (ve daha sık kullanılan) pratiktir:

~ / Kütüphane / Uygulama Desteği /

Sadece bu durumda dosyaların otomatik olarak buluta kaydedilmeyeceğini bilin. Oynatıcının seçim yapmasını istiyorsanız, onu seçmek için platformun API'sini kullanın.

Paylaşılan oyun verileri

/ Kütüphane / Uygulama Desteği

Hayır olduğuna dikkat edin, ~kullanıcının evi ile değil, sistemin köküyle ilgili.

Geçici oyun verileri:

Verilerin yürütmeler arasında tutulmasına gerek yoksa:

/ tmp

Verilerin yürütmeler arasında tutulması gerekiyorsa;

/ Kütüphane / Önbellek (MacOSX için)

C ++ Boost kullanıcıları : orada basit bir çapraz platform boost.filesystem fonksiyonu bunun için

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

4
İçine hiçbir şey koymayın~/Documents . Bu kullanıcının düzenlemeyi seçmesi içindir; Belgeler içinde asla sabit bir yola yazmamalısınız. Oyununuz ~/Library/Application Support/Your App Name/tasarruflar ve diğer kullanıcı verileri için kullanmalıdır .
Kevin Reid

@KevinReid "Kullanıcının bir uygulamanın kullanıcı arayüzünde oluşturduğu ve gördüğü dokümanlar - örneğin Sayfalar, Sayılar ve Keynote içindeki doküman tarayıcıları Dokümanlar dizininde saklanmalıdır. Yine, çünkü bunlar bir uygulamanın seçim için potansiyel olarak bir yöntem sunabileceği bir şeydir. " - Kaynak: Apple'ın önerisi, ilk linkte. Bir şey mi kaçırdım?
Klaim

2
Bunların hepsinde vurgu üzerindedir seçerek . Kullanıcı, ne adlandırıldıklarını ve nereye gittiklerini seçer. Kullanıcının yönetmediği dosyalar Belgeler'e yerleştirilmemelidir, çünkü Belgeler, geliştiricinin değil, kullanıcının ad alanıdır. (Feragatname: Tavsiyemin Apple'ın belgelerine uygun olduğunu iddia etmiyorum. Mac için tasarlanmış uygulamalar arasında uygulamanın çoğunluğunu yansıttığını ve kullanıcıların onunla daha mutlu olacağını iddia ediyorum.)
Kevin Reid

Ayrıca, X Mac işletim sistemi öncesi hiçbir “Kütüphane” dizini yoktu. Bağlantılı belgelerdeki “(OS X)” sözleri, iOS kullanıcıya bir dosya sistemini göstermediğinden tamamen farklı bir soru olan iOS ile çelişmektedir .
Kevin Reid

@KevinReid Kütüphane sayfalarını güncelleyeceğim, teşekkürler. Ancak seçme ve belgeler hakkında söyledikleriniz için bu çelişkili görünmektedir. Oyun kaydetme kullanıcıya bağlıdır, uygulamaya veya geliştiriciye göre değildir. Oyuna bağlı, bu yüzden paylaşılan bir oyun veri dizini de bu yüzden var. Yani tam olarak ne demek istediğini anlamıyorum. Bu konuda bir yerlerde rasyonel mi var?
Klaim

13

Linux Debian (Ubuntu, Fedora, vb.)

Dayalı:

Unix tabanlı işletim sistemlerinde ~ dizini, kullanıcıya özel verilerin bulunduğu kullanıcının giriş dizininde otomatik olarak bulunur. Bu, dil ne olursa olsun, bu platformlarda işletim sistemine özgü bir işlev kullanmak yerine ~ kullanarak bu klasöre otomatik olarak erişebileceğiniz anlamına gelir. Ayrıca, tüm sistemin kök yolu olduğunu, ana diskin kökünün yolu olmadığını unutmayın.

Bu dizine oyun veya oyun şirketi ile kendi dizini ekleyiniz.


Oyuncunun oyun verileri

Geleneksel olarak, Aquaria oyunu için:

~ / .Aquaria

İle başlayan dizinlerin ve dosyaların .varsayılan olarak kullanıcıya gizleneceğini unutmayın.

Artık çoğu masaüstü , önerilen XDG özelliklerine uymaya çalışıyor

$ XDG_CONFIG_HOME / akvaryumlar

veya

$ XDG_DATA_HOME / akvaryumlar

yapılandırma ve kaydetme oyunları için.

Eğer $XDG_CONFIG_HOMEset kullanılmadığı:

~ / .Config / akvaryumlar

veya

~ / .Local / akvaryumlar

Bu daha çok kullanıcının ana dizinidir ve kullanıcıların gerekli gördükleri durumlarda bir uygulamanın birden fazla profilini çalıştırmalarına izin verir. Spesifikasyonda, kullanıcıya özel başka rehberler de vardır.

Paylaşılan oyun verileri

/ Var / oyunlar /

Paylaşılan yapılandırma dosyaları içinde bulunmalıdır.

/ Etc / oyunlar /

Geçici oyun verileri

/ tmp


1
Ayrıntılı olarak: Bir oyun "Aquaria" oyun verilerini ~ / .aquaria (ya da ~ / .config / Aquaria) içine koymalıdır. / Var; dünyaca yazılabilir bir dizine sahip olmak için kaşlarını çattı; Bunu gerçekleştirmenin genel yolu, oyununuz için bir kullanıcı hesabı oluşturmak ve onu bu dizine yazabilecek tek hesap yapmaktır (ve normal insanlar oyunu oynarken setuid kullanın). Bu istediğinden daha fazla iş olabilir.
dhasenan

Aslında, çoğu masaüstü şimdi, XDG spesifikasyonuna uymaya çalışıyor; bu, $ XDG_CONFIG_HOME / akvaryum (ya da ayarlanmamışsa ~ / .config / akvaryum) ve $ XDG_DATA_HOME / akvaryum (veya ~ / .local / akvaryum) yapılandırma ve savegames yerine (bkz standards.freedesktop.org/basedir-spec/basedir-spec-latest.html ). Bu daha çok kullanıcının ana dizinidir ve kullanıcıların gerekli gördükleri durumlarda bir uygulamanın birden fazla profilini çalıştırmalarına izin verir. Spesifikasyonda, kullanıcıya özel başka özel dizinler de vardır.
liori

@liori Zaman bulabilirsem yarın cevapları güncelleyeceğim, gecikme için üzgünüm. İsterseniz ve zamanınız varsa, lütfen bilgileri güncellemekten çekinmeyin. Benim için de faydalı.
Klaim
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.