Trong thư mục nào để viết trò chơi lưu tập tin / dữ liệu?


37

Tôi cần một danh sách xác định các thư mục, một hoặc nhiều trên mỗi nền tảng, về nơi đặt các tệp lưu trò chơi và dữ liệu do trò chơi khác tạo . Dựa trên đặc điểm kỹ thuật của nhà phát triển hệ điều hành, hoặc bởi vì nó được sử dụng phổ biến nếu không có khuyến nghị.

Vui lòng cung cấp một câu trả lời cho mỗi nền tảng , với các thư mục khác nhau. Ngoài ra, ví dụ về cách lấy vị trí thư mục trong C ++ hoặc C là tốt nhất , vì đó là ngôn ngữ bạn sẽ gặp nhiều khó khăn hơn.

Địa điểm:

  • Dữ liệu trò chơi trên mạng (trò chơi đã lưu, cấu hình).
  • Dữ liệu trò chơi được chia sẻ (như điểm số cao hoặc cấu hình cho tất cả người dùng máy tính).
  • Dữ liệu trò chơi tạm thời (còn gọi là thư mục bộ đệm).

1
Bạn có lẽ nên đặt tất cả các câu trả lời thành một, vì không có một câu trả lời nào để chấp nhận?
Zolomon

@Zolomon Vấn đề là một câu trả lời với tất cả các nền tảng sẽ quá lớn tôi nghĩ. Đặc biệt nếu bạn thêm nền tảng di động / máy tính bảng ...
Klaim

có thể đáng chú ý (vì có thể có nhiều người chia sẻ ý kiến ​​này) rằng ít nhất tôi ghét khi các trò chơi không lưu vào thư mục (cài đặt) tôn trọng của họ. Tôi thích các trò chơi nơi người dùng trong trò chơi được tạo trong trò chơi và không cần phải che giấu nữa: các PC tôi sử dụng để chơi game không bao giờ đủ nhiều người dùng để sử dụng cả người dùng HĐH. Hoặc nếu nó phải sử dụng nó, tôi thích các trò chơi thực hiện nó trong nội bộ. Có thể không phải là trường hợp, nhưng: ý tưởng về một người dùng hệ điều hành = một phần của người dùng trò chơi thay đổi cũng gây lo lắng. lưu ý tôi là một game thủ windows. trên * unix nó khác, FS cố định buộc khái niệm (không có ổ đĩa)
n611x007

@naxa Nếu điều đó có thể "an ủi" bạn, tôi đang tạo một trò chơi có quản lý tài khoản người chơi bên trong, nhưng tài khoản người chơi vẫn phải được lưu trữ trong tài khoản của người dùng vì lý do bảo mật hệ điều hành. Tôi có thể lưu trữ chúng trong repo chia sẻ quá, không chắc chắn. Ngoài ra, tôi sẽ cần cho phép người dùng giữ dữ liệu trực tuyến tại một số điểm.
Klaim

3
@naxa Vấn đề là trên Vista, Windows7, Windows8, trừ khi được quản trị cụ thể, các chương trình sẽ không thể ghi vào Chương trình Tệp \ Game-Install-Dir \. Tôi tin rằng điều này cũng đúng trên các phiên bản Linux và OSX gần đây.
Nate

Câu trả lời:


23

Windows (Xp và sau)

Dựa trên:

Các vị trí này giả định rằng Windows được cài đặt trên đĩa C :. Nối thư mục của riêng bạn với tên trò chơi hoặc công ty trò chơi sau đó tên trò chơi vào các thư mục này.


Nếu bạn sử dụng ứng dụng kiểu Window 8 Metro , bạn sẽ phải sử dụng một API cụ thể thay vì cố gắng tiếp cận các thư mục. Đọc:


Dữ liệu trò chơi

Windows Vista và sau đây:

C: \ Người dùng \ {tên người dùng} \ AppData \ Chuyển vùng

Windows Xp:

C: \ Tài liệu và Cài đặt \ {tên người dùng} \ Dữ liệu ứng dụng

Bạn có thể tự động lấy đúng địa chỉ phụ thuộc tên người dùng bằng cách lấy APPDATAbiến môi trường .

Tiêu chuẩn C (tất cả các trình biên dịch):

char* appdata = getenv("APPDATA");

Visual Studio 20xx ( tránh cảnh báo getenv () nói rằng nó không an toàn ) - không phải kiểu Metro:

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

Tăng cường người dùng : tại thời điểm tôi viết boost.filesystem này (đó cũng là bản nháp của thư viện hệ thống tập tin được đề xuất cho tiêu chuẩn C ++ tiếp theo) chưa triển khai một chức năng để cung cấp đúng thư mục. Tuy nhiên, đã có những cuộc thảo luận về điều này trước đây . Xin vui lòng cập nhật phần này nếu mọi thứ thay đổi.


Dữ liệu trò chơi được chia sẻ

Windows Vista và sau đây:

C: \ Chương trìnhData

Windows Xp:

C: \ Tài liệu và Cài đặt \ Tất cả người dùng

Bạn có thể tự động lấy đúng địa chỉ bằng cách lấy PROGRAMDATAbiến môi trường .

Tiêu chuẩn C (tất cả các trình biên dịch):

char* appdata = getenv("PROGRAMDATA");

Visual Studio 20xx ( tránh cảnh báo getenv () nói rằng nó không an toàn ) - không phải kiểu Metro:

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

Tăng cường người dùng : tại thời điểm tôi viết boost.filesystem này (đó cũng là bản nháp của thư viện hệ thống tập tin được đề xuất cho tiêu chuẩn C ++ tiếp theo) chưa triển khai một chức năng để cung cấp đúng thư mục. Tuy nhiên, đã có những cuộc thảo luận về điều này trước đây . Xin vui lòng cập nhật phần này nếu mọi thứ thay đổi.


Dữ liệu trò chơi tạm thời

Windows Vista và sau đây:

C: \ Chương trìnhData

Windows Xp:

C: \ Tài liệu và Cài đặt \ {tên người dùng} \ Cài đặt cục bộ \ Temp

Bạn có thể tự động lấy đúng địa chỉ bằng cách lấy TEMPbiến môi trường .

Người dùng C ++ Boost : có chức năng boost.filesystem đa nền tảng đơn giản cho việc này

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

Tiêu chuẩn C (tất cả các trình biên dịch):

char* appdata = getenv("TEMP");

Visual Studio 20xx ( tránh cảnh báo getenv () nói rằng nó không an toàn ) - không phải kiểu Metro:

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

4
Trên Vista trở lên, nên lưu các trò chơi tiết kiệm trong thư mục "Trò chơi đã lưu" đặc biệt. Thêm thông tin tại đây: msdn.microsoft.com/en-us/l Library / windows / desktop / For Hãy tìm "FOLDERID_SattedGames"
Durza007

1
Bạn không bao giờ nên cố gắng tự đoán đường dẫn hoặc xây dựng nó từ các biến môi trường, thực sự. Trên Vista trở lên, bạn nên gọi SHGetKnownFolderPath ( msdn.microsoft.com/en-us/l Library / bb762188.aspx ) và trên XP và bên dưới sử dụng SHGetFolderPath ( msdn.microsoft.com/en-us/l Library / b762181 )
Kylotan

@Kylotan và Durza007, tôi có một chút thời gian, vui lòng chỉnh sửa câu trả lời này khi cần thiết. Thực hiện câu trả lời này cộng đồng wiki.
Klaim

Tôi nghĩ điều quan trọng là phải nói rằng tài liệu msDN gợi ý sử dụng SHGetKnownFolderPath vì SHGetFolderPath chỉ là một trình bao bọc cho phương thức mới và chỉ được hỗ trợ cho khả năng tương thích ngược.
Kagemusha

16

Hệ điều hành Mac

Dựa trên:

Trong HĐH dựa trên unix, ~thư mục được tự động đặt tại thư mục chính của người dùng nơi chứa dữ liệu cụ thể của người dùng. Điều này có nghĩa là bất kể ngôn ngữ nào, trên các nền tảng này, bạn có thể tự động truy cập thư mục này bằng cách sử dụng ~thay vì sử dụng chức năng dành riêng cho hệ điều hành. Cũng lưu ý rằng đó /là đường dẫn gốc của toàn bộ hệ thống, không phải là đường dẫn đến thư mục gốc của đĩa chính.

Nối thư mục của riêng bạn với tên trò chơi hoặc công ty trò chơi sau đó tên trò chơi vào các thư mục này.


Dữ liệu trò chơi

Hướng dẫn của Apple là định vị các tệp lưu và cấu hình ở đó để làm cho chúng được lưu tự động trong đám mây nếu có:

~ / Tài liệu

Tuy nhiên, cách tốt hơn (và thường được sử dụng hơn) để xác định vị trí các tệp này trong:

~ / Thư viện / Hỗ trợ ứng dụng /

Chỉ cần biết rằng trong trường hợp này, các tệp sẽ không được lưu tự động vào đám mây. Nếu bạn muốn người chơi chọn, hãy sử dụng API của nền tảng để khiến anh ta chọn.

Dữ liệu trò chơi được chia sẻ

/ Thư viện / Hỗ trợ ứng dụng

Lưu ý rằng không có ~, nó không liên quan đến nhà của người dùng mà là gốc của hệ thống.

Dữ liệu trò chơi tạm thời:

Nếu dữ liệu không cần phải được giữ giữa các lần thực hiện:

/ tmp

Nếu dữ liệu cần phải được giữ giữa các lần thực hiện;

/ Thư viện / Bộ nhớ cache (cho MacOSX)

Người dùng C ++ Boost : có chức năng boost.filesystem đa nền tảng đơn giản cho việc này

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

4
Đừng đặt bất cứ thứ gì vào ~/Documents. Đó là cho người dùng lựa chọn để tổ chức; bạn không bao giờ nên ghi vào một đường dẫn cố định trong Tài liệu. Trò chơi của bạn nên sử dụng ~/Library/Application Support/Your App Name/để lưu và dữ liệu người dùng khác.
Kevin Reid

@KevinReid "Tài liệu mà người dùng tạo và nhìn thấy trong giao diện người dùng của ứng dụng, ví dụ như các trình duyệt tài liệu trong Pages, Numbers và Keynote nên được lưu trữ trong thư mục Documents. Một ví dụ khác về các tệp có trong thư mục Documents là các trò chơi đã lưu , một lần nữa bởi vì chúng là thứ mà một ứng dụng có khả năng cung cấp một số phương pháp để lựa chọn. " - Nguồn: Khuyến nghị của Apple, trong liên kết đầu tiên. Tôi đã bỏ lỡ một cái gì đó?
Klaim

2
Trong tất cả những điểm nhấn là chọn . Người dùng chọn những gì họ được đặt tên và nơi họ đi. Không nên đặt các tệp mà người dùng không quản lý trong Tài liệu, vì Tài liệu là không gian tên của người dùng, không phải của nhà phát triển. (Tuyên bố miễn trừ trách nhiệm: Tôi không khẳng định rằng lời khuyên của tôi phù hợp với tài liệu của Apple. Tôi khẳng định rằng nó phản ánh phần lớn thực tiễn trong số các ứng dụng dành cho máy Mac và người dùng sẽ hài lòng hơn với nó.)
Kevin Reid

Ngoài ra, không có thư mục nào của Thư viện trên các hệ điều hành Mac tiền X. Các nhận xét của Wap (OS X) trong tài liệu được liên kết tương phản với iOS , đây là một câu hỏi hoàn toàn khác vì iOS không để lộ hệ thống tập tin cho người dùng.
Kevin Reid

@KevinReid Tôi sẽ cập nhật nội dung Thư viện, cảm ơn. Tuy nhiên, đối với những gì bạn nói về việc lựa chọn và Tài liệu, điều này có vẻ mâu thuẫn. Trò chơi lưu là người dùng, không phải người dùng ứng dụng hoặc nhà phát triển. Vâng, nó phụ thuộc vào trò chơi, đó là lý do tại sao cũng có một thư mục dữ liệu trò chơi được chia sẻ. Vì vậy, tôi không hiểu ý của bạn chính xác. Có một số lý do ở đâu đó về điều đó?
Klaim

13

Linux Debian (Ubuntu, Fedora, v.v.)

Dựa trên:

Trong hệ điều hành dựa trên unix, thư mục ~ được tự động đặt tại thư mục chính của người dùng nơi chứa dữ liệu cụ thể của người dùng. Điều này có nghĩa là bất kể ngôn ngữ nào, trên các nền tảng này, bạn có thể tự động truy cập thư mục này bằng cách sử dụng ~ thay vì sử dụng chức năng dành riêng cho hệ điều hành. Cũng lưu ý rằng / là đường dẫn gốc của toàn bộ hệ thống, không phải là đường dẫn đến thư mục gốc của đĩa chính.

Nối thư mục của riêng bạn với tên trò chơi hoặc công ty trò chơi sau đó tên trò chơi vào các thư mục này.


Dữ liệu trò chơi

Theo truyền thống, đối với trò chơi Aquaria, đó sẽ là:

~ / .aquaria

Lưu ý rằng các thư mục và tệp bắt đầu bằng .sẽ được ẩn theo mặc định cho người dùng.

Hầu hết các máy tính để bàn hiện nay đều cố gắng tuân thủ thông số XDG , khuyến nghị

$ XDG_CONFIG_HOME / hồ

hoặc là

$ XDG_DATA_HOME / hồ

để cấu hình và lưu tên thay thế.

Nếu $XDG_CONFIG_HOMEkhông được đặt, hãy sử dụng:

~ / .config / hồ

hoặc là

~ / .local / hồ

Điều này chủ yếu là để giải nén thư mục chính của người dùng, cũng như cho phép người dùng chạy nhiều hồ sơ của một ứng dụng nếu họ thấy cần thiết. Ngoài ra còn có các thư mục dành riêng cho người dùng cụ thể trong đặc tả.

Dữ liệu trò chơi được chia sẻ

/ var / trò chơi /

Các tập tin cấu hình được chia sẻ nên được đặt trong

/ etc / trò chơi /

Dữ liệu trò chơi tạm thời

/ tmp


1
Để giải thích: một trò chơi "Aquaria" nên đặt dữ liệu trò chơi của nó vào ~ / .aquaria (hoặc ~ / .config / Aquaria). Nó cau mày khi có một thư mục có thể ghi trên thế giới trong / var; Cách chung để thực hiện điều đó là tạo tài khoản người dùng cho trò chơi của bạn và biến nó thành tài khoản duy nhất có thể ghi vào thư mục đó (và sau đó sử dụng setuid khi người bình thường đang chơi trò chơi). Đây có thể là công việc nhiều hơn bạn muốn.
dhasenan

Thực ra, hầu hết các máy tính để bàn hiện nay đều cố gắng tuân thủ đặc tả XDG, khuyến nghị $ XDG_CONFIG_HOME / aquaria (hoặc ~ / .config / aquaria nếu không được đặt) và $ XDG_DATA_HOME / aquaria (hoặc ~ / .local / aquaria) cho cấu hình và savegames thay thế (xem standards.freedesktop.org/basedir-spec/basedir-spec-latest.html ). Điều này chủ yếu là để giải nén thư mục chính của người dùng, cũng như cho phép người dùng chạy nhiều hồ sơ của một ứng dụng nếu họ thấy cần thiết. Ngoài ra còn có các thư mục dành riêng cho người dùng cụ thể trong đặc tả.
liori

@liori Tôi sẽ cập nhật câu trả lời vào ngày mai nếu tôi có thể tìm thấy thời gian, xin lỗi vì sự chậm trễ. Nếu bạn cảm thấy thích nó và có thời gian, xin vui lòng cập nhật thông tin. Nó cũng hữu ích cho tôi.
Klaim
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.