ไดเร็กตอรี่ใดที่จะเขียนไฟล์ / ข้อมูลของเกม?


37

ฉันต้องมีรายการที่ชัดเจนของไดเรกทอรีหนึ่งหรือมากกว่าต่อแพลตฟอร์มของการที่จะนำเกมบันทึกไฟล์และเกมที่สร้างข้อมูลอื่นอาจเป็นไปตามข้อกำหนดของนักพัฒนาระบบปฏิบัติการหรือเนื่องจากเป็นการใช้งานทั่วไปหากไม่มีข้อเสนอแนะ

โปรดระบุหนึ่งคำตอบต่อแพลตฟอร์มที่มีไดเรกทอรีต่างกัน นอกจากนี้ตัวอย่างวิธีรับตำแหน่งไดเรกทอรีใน C ++ หรือ C นั้นดีที่สุดเนื่องจากเป็นภาษาที่คุณจะมีเวลามากขึ้น

สถานที่:

  • ข้อมูลเกมของผู้เล่น (เกมที่บันทึกไว้, การกำหนดค่า)
  • ข้อมูลเกมที่แชร์ (เช่นคะแนนสูงหรือกำหนดค่าสำหรับผู้ใช้คอมพิวเตอร์ทุกคน)
  • ข้อมูลเกมชั่วคราว (ไดเรกทอรีแคช aka)

1
คุณควรใส่คำตอบทั้งหมดไว้ในคำตอบเดียวเพราะไม่มีคำตอบเดียวที่จะยอมรับ?
Zolomon

@Zolomon ปัญหาคือว่าคำตอบเดียวกับทุกแพลตฟอร์มจะใหญ่เกินไปที่ฉันคิด โดยเฉพาะอย่างยิ่งถ้าคุณเพิ่มแพลตฟอร์มมือถือ / แท็บเล็ต ...
อ้างสิทธิ์

มันอาจจะคุ้มค่าที่จะสังเกต (เพราะอาจมีใครมากกว่าที่แบ่งปันความคิดเห็นนี้) อย่างน้อยฉันก็เกลียดเมื่อเกมไม่ได้บันทึกลงในไดเรกทอรี (ติดตั้ง) ที่เคารพ ฉันชอบเกมที่ผู้ใช้ในเกมสร้างขึ้นในเกมและไม่จำเป็นต้องปิดบังอีกต่อไป: พีซีที่ฉันใช้สำหรับเล่นเกมนั้นไม่มีผู้ใช้หลายคนพอที่จะใช้ผู้ใช้ระบบปฏิบัติการได้เลย หรือถ้ามันต้องใช้ฉันชอบเกมที่ทำภายใน อาจไม่เป็นเช่นนั้น แต่: ความคิดของผู้ใช้ระบบปฏิบัติการหนึ่งราย = การเปลี่ยนแปลงผู้ใช้เกมหนึ่งชิ้นก็เป็นเรื่องที่น่าวิตกเช่นกัน ฉันเป็นนักเล่นเกม windows บน * unix มันแตกต่างกัน FS ที่ถูกบังคับจะบังคับแนวคิด (ไม่มีไดรฟ์)
n611x007

@naxa หากนั่นสามารถ "ปลอบประโลมคุณ" ฉันกำลังสร้างเกมที่มีการจัดการบัญชีผู้เล่นอยู่ภายใน แต่บัญชีผู้เล่นจะต้องเก็บไว้ในบัญชีผู้ใช้ด้วยเหตุผลด้านความปลอดภัยของระบบปฏิบัติการ ฉันอาจเก็บไว้ใน repo ที่แชร์ด้วยเช่นกันไม่แน่ใจ นอกจากนี้ฉันจะต้องอนุญาตให้ผู้ใช้เก็บข้อมูลออนไลน์ในบางจุด
Klaim

3
@naxa ปัญหาคือว่าบน Vista, Windows7, Windows8 ยกเว้นว่าจะทำงานเป็นผู้ดูแลระบบโดยเฉพาะโปรแกรมจะไม่สามารถเขียนไปยัง Program Files \ Game-Install-Dir \ ฉันเชื่อว่านี่เป็นจริงสำหรับ Linux และ OSX รุ่นใหม่กว่าเช่นกัน
เนท

คำตอบ:


23

Windows (Xp และต่อไปนี้)

ขึ้นอยู่กับ:

ตำแหน่งที่ตั้งเหล่านี้สมมติว่ามีการติดตั้ง Windows บนดิสก์ C: ผนวกไดเรกทอรีของคุณเองด้วยชื่อเกมหรือ บริษัท เกมจากนั้นชื่อเกมไปยังไดเรกทอรีเหล่านี้


หากคุณใช้แอปพลิเคชั่นสไตล์ Metro 8 ของ Windowคุณจะต้องใช้ API เฉพาะแทนที่จะพยายามเข้าถึงไดเรกทอรี อ่าน:


ข้อมูลเกมของผู้เล่น

Windows Vista และต่อไปนี้:

C: \ Users \ ชื่อผู้ใช้ {} \ AppData \ Roaming

Windows Xp:

C: \ Documents and Settings \ {ชื่อผู้ใช้} \ ข้อมูลแอปพลิเคชัน

คุณจะสามารถได้รับที่อยู่ชื่อผู้ใช้ขึ้นอยู่กับทางขวาโดยได้รับตัวแปรสภาพแวดล้อม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 และ 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 : มีฟังก์ชั่นเพิ่มประสิทธิภาพข้ามแพลตฟอร์มแบบง่าย ๆสำหรับสิ่งนี้

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/en-us/library/windows/desktop/มองหา "FOLDERID_SavedGames"
Durza007

1
คุณไม่ควรพยายามเดาเส้นทางด้วยตัวคุณเองหรือสร้างมันขึ้นมาจากตัวแปรสภาพแวดล้อมจริงๆ บน Vista และสูงกว่าคุณควรโทร SHGetKnownFolderPath ( msdn.microsoft.com/en-us/library/bb762188.aspx ) และบน XP และต่ำกว่าใช้ SHGetFolderPath ( msdn.microsoft.com/en-us/library/bb762181.aspx )
Kylotan

@Kylotan และ Durza007 ฉันมีเวลาไม่มากพอที่จะแก้ไขคำตอบนี้ได้ตามต้องการ ทำให้วิกินี้เป็นชุมชนคำตอบ
Klaim

ฉันคิดว่ามันสำคัญที่จะบอกว่าเอกสารของ msdn แนะนำให้ใช้ SHGetKnownFolderPath เนื่องจาก SHGetFolderPath เป็นเพียงเครื่องมือเสริมสำหรับวิธีการใหม่และรองรับความเข้ากันได้แบบย้อนหลังเท่านั้น
Kagemusha

16

MacOS

ขึ้นอยู่กับ:

ในระบบปฏิบัติการที่ใช้ unix ~ไดเร็กทอรีจะอยู่ที่โฮมไดเร็กตอรี่ของผู้ใช้ซึ่งมีข้อมูลเฉพาะของผู้ใช้อยู่ ซึ่งหมายความว่าไม่ว่าจะใช้ภาษาใดในแพลตฟอร์มเหล่านี้คุณสามารถเข้าถึงโฟลเดอร์นี้โดยอัตโนมัติโดยใช้~แทนการใช้ฟังก์ชั่นเฉพาะระบบปฏิบัติการ โปรดทราบด้วยว่านั่น/คือเส้นทางหลักของทั้งระบบไม่ใช่เส้นทางไปยังรูทของดิสก์หลัก

ผนวกไดเรกทอรีของคุณเองด้วยชื่อเกมหรือ บริษัท เกมจากนั้นชื่อเกมไปยังไดเรกทอรีเหล่านี้


ข้อมูลเกมของผู้เล่น

แนวทางของ Apple คือค้นหาบันทึกและกำหนดค่าไฟล์ที่นั่นเพื่อให้บันทึกโดยอัตโนมัติในคลาวด์หากมี:

~ / เอกสาร

อย่างไรก็ตามมันเป็นการปฏิบัติที่ดีกว่า (และใช้บ่อยกว่า) ในการค้นหาไฟล์เหล่านี้ใน:

~ / Library / แอปพลิเคชันสนับสนุน /

เพิ่งรู้ว่าในกรณีนี้ไฟล์จะไม่ถูกบันทึกไว้ในระบบคลาวด์โดยอัตโนมัติ หากคุณต้องการให้ผู้เล่นเลือกใช้ API ของแพลตฟอร์มเพื่อให้เขาเลือก

ข้อมูลเกมที่แชร์

/ Library / Application Support

ขอให้สังเกตว่าไม่มี~มันไม่ได้เกี่ยวข้องกับบ้านของผู้ใช้ แต่เพื่อรูทของระบบ

ข้อมูลเกมชั่วคราว:

หากข้อมูลไม่จำเป็นต้องเก็บไว้ระหว่างการดำเนินการ:

tmp /

หากจำเป็นต้องเก็บข้อมูลไว้ระหว่างการดำเนินการ

/ Library / Caches (สำหรับ MacOSX)

ผู้ใช้ C ++ Boost : มีฟังก์ชั่นเพิ่มประสิทธิภาพข้ามแพลตฟอร์มแบบง่าย ๆสำหรับสิ่งนี้

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

4
อย่า~/Documentsวางสิ่งของใน นั่นคือเพื่อให้ผู้ใช้เลือกที่จะจัดระเบียบ คุณไม่ควรเขียนเส้นทางที่แน่นอนภายในเอกสาร เกมของคุณควรใช้~/Library/Application Support/Your App Name/สำหรับบันทึกและข้อมูลผู้ใช้อื่น ๆ
Kevin Reid

@KevinReid "เอกสารที่ผู้ใช้สร้างและเห็นในอินเทอร์เฟซผู้ใช้ของแอพตัวอย่างเช่นเบราว์เซอร์เอกสารใน Pages, Numbers, และ Keynote ควรเก็บไว้ในไดเรกทอรี Documents อีกตัวอย่างของไฟล์ที่อาจไปในไดเรกทอรี Documents เป็นเกมที่บันทึกไว้ อีกครั้งเพราะมันเป็นสิ่งที่แอพอาจมีวิธีการบางอย่างสำหรับการเลือก " - ที่มา: คำแนะนำของ Apple ในลิงค์แรก ฉันพลาดอะไรไปหรือเปล่า?
Klaim

2
ในบรรดาเน้นอยู่ในการเลือก ผู้ใช้เลือกสิ่งที่พวกเขามีชื่อและที่พวกเขาไป ไฟล์ที่ผู้ใช้ไม่ได้จัดการไม่ควรวางไว้ในเอกสารเนื่องจากเอกสารเป็นเนมสเปซของผู้ใช้ไม่ใช่ของนักพัฒนา (ข้อจำกัดความรับผิดชอบ: ฉันไม่อ้างว่าคำแนะนำของฉันสอดคล้องกับเอกสารของ Apple ฉันอ้างว่ามันสะท้อนให้เห็นถึงการปฏิบัติส่วนใหญ่ในแอปพลิเคชันที่ออกแบบมาสำหรับ Mac และผู้ใช้จะมีความสุขมากขึ้น)
Kevin Reid

นอกจากนี้ยังไม่มีไดเรกทอรี“ Library” ใน pre-X Mac OS ข้อสังเกต“ (OS X)” ในเอกสารที่เชื่อมโยงนั้นตัดกันกับiOSซึ่งเป็นคำถามที่แตกต่างอย่างสิ้นเชิงเนื่องจาก iOS ไม่ได้เปิดเผยระบบไฟล์ให้กับผู้ใช้
Kevin Reid

@KevinReid ฉันจะอัพเดทสิ่งต่างๆในห้องสมุดขอบคุณ อย่างไรก็ตามสำหรับสิ่งที่คุณพูดเกี่ยวกับการเลือกและเอกสารดูเหมือนจะขัดแย้งกัน บันทึกเกมเป็นแบบสัมพันธ์กับผู้ใช้ไม่ใช่เกี่ยวกับแอปพลิเคชันหรือนักพัฒนาซอฟต์แวร์ มันขึ้นอยู่กับเกมซึ่งเป็นสาเหตุว่าทำไมจึงมีไดเรกทอรีข้อมูลเกมที่ใช้ร่วมกัน ดังนั้นฉันไม่เข้าใจความหมายที่แท้จริงของคุณ มีเหตุผลบางอย่างเกี่ยวกับที่?
Klaim

13

Linux Debian (Ubuntu, Fedora และอื่น ๆ )

ขึ้นอยู่กับ:

ในระบบปฏิบัติการที่ใช้ unix ไดเร็กทอรี ~ จะอยู่ที่โฮมไดเร็กตอรี่ของผู้ใช้โดยอัตโนมัติซึ่งมีข้อมูลเฉพาะของผู้ใช้ ซึ่งหมายความว่าไม่ว่าจะใช้ภาษาใดในแพลตฟอร์มเหล่านี้คุณสามารถเข้าถึงโฟลเดอร์นี้โดยอัตโนมัติโดยใช้ ~ แทนการใช้ฟังก์ชั่นเฉพาะระบบปฏิบัติการ โปรดทราบว่า / เป็นเส้นทางหลักของระบบทั้งหมดไม่ใช่เส้นทางไปยังรากของดิสก์หลัก

ผนวกไดเรกทอรีของคุณเองด้วยชื่อเกมหรือ บริษัท เกมจากนั้นชื่อเกมไปยังไดเรกทอรีเหล่านี้


ข้อมูลเกมของผู้เล่น

ตามเนื้อผ้าสำหรับเกม Aquaria มันจะเป็น:

~ / .aquaria

โปรดทราบว่าไดเรกทอรีและไฟล์ที่ขึ้นต้นด้วย.จะถูกซ่อนไว้โดยผู้ใช้เป็นค่าเริ่มต้น

เดสก์ท็อปส่วนใหญ่พยายามที่จะปฏิบัติตามข้อกำหนด XDGซึ่งแนะนำ

$ XDG_CONFIG_HOME / ตู้

หรือ

$ XDG_DATA_HOME / ตู้

สำหรับการกำหนดค่าและ savegames แทน

หาก$XDG_CONFIG_HOMEไม่ได้ตั้งค่าการใช้งาน:

~ / .config / ตู้

หรือ

~ / .local / ตู้

นี่เป็นส่วนใหญ่ในการแยกไดเรกทอรีหลักของผู้ใช้รวมถึงอนุญาตให้ผู้ใช้เรียกใช้หลายโปรไฟล์ของแอปพลิเคชันหากพวกเขาเห็นว่าจำเป็น นอกจากนี้ยังมีไดเรกทอรีเฉพาะผู้ใช้เฉพาะในสเปค

ข้อมูลเกมที่แชร์

/ var / เกม /

ไฟล์การกำหนดค่าที่ใช้ร่วมกันควรอยู่ใน

/ etc / เกม /

ข้อมูลเกมชั่วคราว

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

@liori ฉันจะอัปเดตคำตอบในวันพรุ่งนี้ถ้าฉันสามารถหาเวลาขออภัยในความล่าช้า หากคุณรู้สึกชอบและมีเวลาโปรดอัปเดตข้อมูล มันมีประโยชน์สำหรับฉันเช่นกัน
Klaim
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.