2011-02-03 49 views
6

Tôi muốn tạo một thư mục path = "$HOME/somedir".Cách tạo thư mục trong thư mục chính?

Tôi đã thử sử dụng boost::filesystem::create_directory(path) nhưng không thành công - dường như chức năng không mở rộng biến hệ thống.

Làm cách nào để tôi làm điều đó một cách đơn giản nhất?

(lưu ý: trong trường hợp của tôi chuỗi path là hằng số và tôi không biết chắc chắn nếu nó có chứa một biến)

chỉnh sửa: Tôi đang làm việc trên Linux (mặc dù tôi đang lập kế hoạch để cảng của tôi ứng dụng cho Windows trong tương lai gần).

+2

Bạn đang làm việc trên Linux hoặc cửa sổ? – Nawaz

Trả lời

14

Sử dụng getenv để nhận biến môi trường, bao gồm HOME. Nếu bạn không biết chắc chắn rằng họ có thể có mặt không, bạn sẽ phải phân tích chuỗi tìm kiếm chúng.

Bạn cũng có thể sử dụng hệ vỏ và echo để cho trình bao làm điều này cho bạn.

Getenv là thiết bị di động (từ chuẩn C), nhưng việc sử dụng vỏ để thực hiện điều này sẽ khó hơn giữa * nix và Windows. Công ước cho các biến môi trường khác nhau giữa * nix và Windows, nhưng có lẽ chuỗi là tham số cấu hình có thể được sửa đổi cho nền tảng đã cho.

Nếu bạn chỉ cần để hỗ trợ mở rộng thư mục nhà hơn là biến môi trường tùy ý, bạn có thể sử dụng quy ước ~ và sau đó ~/somedir cho chuỗi cấu hình của bạn:

std::string expand_user(std::string path) { 
    if (not path.empty() and path[0] == '~') { 
    assert(path.size() == 1 or path[1] == '/'); // or other error handling 
    char const* home = getenv("HOME"); 
    if (home or ((home = getenv("USERPROFILE")))) { 
     path.replace(0, 1, home); 
    } 
    else { 
     char const *hdrive = getenv("HOMEDRIVE"), 
     *hpath = getenv("HOMEPATH"); 
     assert(hdrive); // or other error handling 
     assert(hpath); 
     path.replace(0, 1, std::string(hdrive) + hpath); 
    } 
    } 
    return path; 
} 

Hành vi này được sao chép từ Python của os.path.expanduser, ngoại trừ nó chỉ xử lý người dùng hiện tại. Nỗ lực bất khả tri nền tảng có thể được cải thiện bằng cách kiểm tra nền tảng đích thay vì mù quáng thử các biến môi trường khác nhau, mặc dù USERPROFILE, HOMEDRIVEHOMEPATH khó có thể được đặt trên Linux.

4

Off đỉnh đầu của tôi,

namespace fs = boost::filesystem; 
fs::create_directory(fs::path(getenv("HOME"))); 
+1

Xem "trong trường hợp của tôi, đường dẫn chuỗi là hằng số và tôi không biết chắc chắn nó có chứa biến" hay không. Ngoài ra, bạn có thể muốn kiểm tra giá trị trả về của getenv trong trường hợp HOME không được thiết lập - điều này sẽ cực kỳ hiếm, nhưng sẽ tốt hơn nếu hủy hoặc kết thúc bằng một lỗi thay vì đi vào vùng đất không xác định. –

Các vấn đề liên quan