2013-08-03 28 views
10

Tôi có một chương trình có đường dẫn thư mục làm đối số dòng lệnh. Và sau đó tôi nối nó với tên tập tin để truy cập các tập tin đó.Có thành ngữ nào để thêm dấu gạch chéo vào đường dẫn tệp không?

Ví dụ, FOLDER_PATH là "./config/" và sau đó FILE_PATH sẽ là "./config/app.conf" như hình dưới đây

stringstream ss; 
ss << folder_path << "app.conf"; 
file_path = ss.str(); 

Nhưng điều này sẽ không hoạt động nếu FOLDER_PATH doesn' t chứa dấu gạch chéo kết thúc. Nó có vẻ giống như một vấn đề phổ biến, vì vậy tôi đã tự hỏi nếu có một thành ngữ để thêm dấu gạch chéo ở cuối nếu nó không tồn tại.

+1

Tôi không biết bất kỳ thành ngữ nào, nhưng tôi nghĩ rằng việc sử dụng thư viện như hệ thống tệp tăng cường linh hoạt hơn nhiều, bạn không phải lo lắng về dấu gạch chéo hoặc dấu gạch chéo ngược (Windows). Hơn nữa thư viện này sẽ là một phần của thư viện chuẩn. – dieram3

Trả lời

11

Tôi thường làm điều này, nếu con đường là một trong std :: string tên tên đường dẫn:

if (!pathname.empty() && *pathname.rbegin() != '/') 
    pathname += '/'; 

Hoặc, với basic_string :: back():

if (!pathname.empty() && pathname.back() != '/') 
    pathname += '/'; 

Thêm một trường hợp cho dấu gạch chéo ngược nếu cần thiết.

Đã thêm: Cũng lưu ý rằng * nix sẽ xử lý các dấu gạch chéo liên tiếp trong tên đường dẫn dưới dạng dấu gạch chéo đơn. Vì vậy, trong nhiều trường hợp, nó đủ để chỉ luôn luôn thêm một dấu gạch chéo mà không kiểm tra.

2

Linux sẽ không quan tâm nếu bạn có dấu gạch chéo bổ sung, vì vậy/home/user/hello và/home/user // hello là cùng một vị trí. Bạn có thể thêm dấu gạch chéo dưới dạng không an toàn. Hoặc, bạn có thể kiểm tra nó bằng cách kiểm tra ký tự cuối cùng.

0

Sử dụng C++ 14/C++ 17 std::filesystem:

#include <experimental/filesystem> // C++14. 
namespace fs = std::experimental::filesystem; // C++14. 
//#include <filesystem> // C++17. 
//namespace fs = std::filesystem; // C++17. 

void addTrailingDelimiter(fs::path& path) { 
    if (!path.empty() && path.generic_string().back() != '/') 
     path += '/'; 
} 

chú ý đến fs::path::generic_string(). Bằng cách đó bạn không phải kiểm tra native path delimiters (bản gốc WinAPI! = Generic, trong khi Posix native = generic).

Bạn có thể bỏ qua if (path.generic_string().back() != '/') vì Posix và WinAPI không quan tâm đến một số dấu phân tách đường dẫn kế tiếp.

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