2010-03-31 8 views
21

Làm cách nào để tìm thư mục chính của người dùng theo cách thức nền tảng chéo trong C++? tức là/home/user trong Linux, C: \ Users \ user \ trên Windows Vista, C: \ Documents and Settings \ user \ trên Windows XP và bất cứ thứ gì mà Mac sử dụng. (Tôi nghĩ đó là/User/user)Tôi làm cách nào để tìm thư mục chính của người dùng theo cách thức nền tảng chéo, sử dụng C++?

Về cơ bản, những gì tôi đang tìm kiếm là một C++ cách để làm điều này (ví dụ trong python)

os.path.expanduser("~") 
+4

Đa nền tảng, bạn không thể. Standard C++ không có chức năng như vậy. –

+1

Kiểm tra câu trả lời của tôi, có một cách đa nền tảng: bạn thực hiện nó bằng cách sử dụng '# ifdef': D – sorin

+0

Xem thêm http: // stackoverflow.com/questions/2910377/get-home-directory-in-linux-c – rogerdpack

Trả lời

22

Tôi không nghĩ rằng nó có thể hoàn toàn ẩn phân chia Windows/Unix với cái này (trừ khi, có lẽ, Boost có cái gì đó).

Cách di động nhất sẽ phải là getenv("HOME") trên Unix và nối các kết quả của getenv("HOMEDRIVE")getenv("HOMEPATH") trên Windows.

+11

+1 Đây là nhiều hay ít những gì Qt thực hiện trong 'QDir :: homepath()': http://doc.trolltech.com/4.6 /qdir.html#homePath. Có thể kiểm tra nguồn của họ, quá. – stephan

+0

Lưu ý thực sự. QT dường như trả về 'CSIDL_PROFILE'. Và trên PC của tôi, đó là một thư mục khác. ('% HOMEDRIVE%' là trên máy chủ tệp, 'CSIDL_PROFILE' không phải là.) – MSalters

+0

@MSalters: chỉ cần kiểm tra nguồn cài đặt Qt hơi ngày của tôi: trên Windows, kiểm tra" HOME "," USERPROFILE "," HOMEDRIVE ". Trên Unix, chỉ cần thử "HOME". Nếu không được đặt, hãy trả về đường dẫn gốc. – stephan

2

Thư mục chính không thực sự là khái niệm đa nền tảng. Đề xuất của bạn về thư mục hồ sơ (% USERPROFILE%) là một sự tương tự công bằng, nhưng tùy thuộc vào những gì bạn muốn làm khi bạn có thư mục, bạn có thể muốn một trong các thư mục Application Data hoặc My Documents của người dùng. Trên UNIX, bạn có thể tạo một ".myapp" ẩn trong thư mục chính để giữ các tệp của bạn, nhưng điều đó không đúng trên Windows.

Đặt cược tốt nhất của bạn là viết mã cụ thể cho từng nền tảng, để nhận được thư mục bạn muốn trong mỗi trường hợp. Tùy thuộc vào độ chính xác mà bạn muốn, nó có thể là đủ để sử dụng vv env: HOME trên UNIX, USERPROFILE hoặc APPDATA (tùy thuộc vào những gì bạn cần) trên Windows. Trên UNIX ít nhất (bất kỳ Windows folks quan tâm để bình luận?), Nó thường là thực hành tốt để sử dụng biến môi trường HOME nếu nó được thiết lập, ngay cả khi nó không đồng ý với thư mục cụ thể trong tập tin mật khẩu. Sau đó, vào dịp lẻ khi người dùng muốn tất cả các ứng dụng đọc dữ liệu của họ từ một thư mục khác, nó sẽ vẫn hoạt động.

14

Điều này có thể, và cách tốt nhất để tìm thấy nó là nghiên cứu mã nguồn của os.path.expanduser("~"), nó là rất dễ dàng để tái tạo các chức năng tương tự trong C.

Bạn sẽ có thêm một số #ifdef chỉ thị để bao gồm các hệ thống khác nhau.

Dưới đây là các quy tắc mà sẽ cung cấp cho bạn các thư mục HOME

  • Windows: env USERPROFILE hoặc nếu điều này không thành, nối HOMEDRIVE + HOMEPATH
  • Linux, Unix và OS X: env HOME hoặc nếu điều này không , sử dụng getpwuid() (example code)

Lưu ý quan trọng: nhiều người giả định rằng HOME biến môi trường luôn luôn có sẵn trên Unix nhưng điều này là không đúng, một ví dụ tốt sẽ là OS X.

Trên OS X khi bạn chạy một ứng dụng từ GUI (không bàn điều khiển) điều này sẽ không có bộ biến này để bạn cần sử dụng getpwuid().