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
, HOMEDRIVE
và HOMEPATH
khó có thể được đặt trên Linux.
Nguồn
2011-02-03 20:09:15
Bạn đang làm việc trên Linux hoặc cửa sổ? – Nawaz