2010-03-07 28 views
29

Tôi có một số boost::filesystem::path trong tay và tôi muốn nối thêm một chuỗi (hoặc đường dẫn) vào nó.Nối thêm vào :: filesystem :: path

boost::filesystem::path p("c:\\dir"); 
p.append(".foo"); // should result in p pointing to c:\dir.foo 

Các quá tải chỉ boost::filesystem::path có của append muốn hai InputIterator s.

Giải pháp của tôi cho đến nay là để làm như sau:

boost::filesystem::path p2(std::string(p.string()).append(".foo")); 

Tôi có thiếu cái gì?

Trả lời

28
#include <iostream> 
#include <string> 
#include <boost/filesystem.hpp> 


int main() { 
    boost::filesystem::path p (__FILE__); 

    std::string new_filename = p.leaf() + ".foo"; 
    p.remove_leaf() /= new_filename; 
    std::cout << p << '\n'; 

    return 0; 
} 

Thử nghiệm với 1,37, nhưng remove_leaf cũng được diễn tả trong 1.35. Bạn sẽ cần phải kiểm tra xem thành phần cuối cùng của p có phải là tên tệp trước không, nếu nó có thể không.

+2

Tôi không chắc chắn nếu điều này là tốt hơn so với những gì tôi hiện đang làm nhưng tôi sẽ chấp nhận nó anyway. – Zack

+0

@Zack: Nó rất gần với những gì bạn có. Tôi đã bắt đầu với API 1.42, nhận thấy nhận xét của bạn về câu trả lời khác về 1,35 và đã làm việc ngược lại để có được điều này. Tuy nhiên, điều này dễ kiểm tra hơn, ví dụ: nếu p.leaf() == "." (vì p == "/ some/dir /"). –

50

Nếu nó thực sự chỉ là phần mở rộng tên tập tin bạn muốn thay đổi thì bạn có lẽ tốt hơn viết:

p.replace_extension(".foo"); 

cho hầu hết các hoạt động đường dẫn tập tin khác mà bạn có thể sử dụng các toán tử /=/ cho phép để ghép các bộ phận của một cái tên. Ví dụ:

boost::filesystem::path p("c:\\dir"); 
p /= "subdir"; 

sẽ tham chiếu c:\dir\subdir.

+2

Tôi đang làm việc với Boost 1,35 vì vậy tôi không có replace_extension được nêu ra.Nhưng ngay cả như vậy tôi không thể thấy làm thế nào bạn nghĩ rằng nó giải quyết vấn đề của tôi. Tôi muốn ** nối thêm ** một "phần mở rộng", không thay đổi nó. Tôi minh họa điều này trong câu hỏi, giả sử 'đường dẫn p (" c: \\ dir ")', bây giờ đến một cái gì đó sẽ nối 'abc' vào' p', kết quả là 'p' trỏ tới' c: \ dirabc '. Toán tử '/' cũng không thể giúp được vấn đề của tôi. – Zack

+1

Bạn nên đề cập đến bạn sử dụng Boost V1.35. Ở đó bạn có hàm global_extension (đường dẫn) toàn cục làm giống như tôi đã mô tả ở trên. Ngoài ra, replace_extension chỉ thêm một phần mở rộng nếu không có phần mở rộng nào. Nếu bạn muốn sửa đổi các phần của đường dẫn của mình (ví dụ: phần thư mục, hãy nói c: \\ dir \\ bla thành c: \\ dirfoo \\ bla), bạn cần tách riêng đường dẫn, sửa đổi các phần của đường dẫn đường dẫn (chỉ là chuỗi) với bất kỳ hàm chuỗi nào bạn thích và đặt chúng lại với nhau sau đó. Không có cách nào xung quanh điều này ... – hkaiser

+3

Nó không thêm phần mở rộng nếu không có phần mở rộng (ít nhất là không ở 1.35). Và nếu có một nó sẽ thay thế nó cho tôi, đó là ** không ** những gì tôi muốn. Tôi chỉ muốn thêm **. Làm theo mã đề xuất của tôi về cách tôi giải quyết nó ngay bây giờ để xem những gì tôi muốn. – Zack

4
path p; 
std::string st = "yoo"; 
p /= st + ".foo"; 
9

Với phiên bản 3 của hệ thống file thư viện (Boost 1.55.0) nó dễ dàng như chỉ

boost::filesystem::path p("one_path"); 
p += "_and_another_one"; 

dẫn đến p = "one_path_and_another_one".

+6

Nhưng vẫn không có toán tử + (std :: string) 'hoặc' operator + (const char *) '. Tôi không biết tại sao họ phải làm cho nó khó khăn như vậy. –

+0

Bất kỳ ý tưởng nào về phiên bản chính xác nào đã được thêm vào? http://www.boost.org/doc/libs/1_49_0/libs/filesystem/v3/doc/release_history.html không có bất kỳ trợ giúp nào và các phiên bản mới hơn dường như không tồn tại ... – Ela782

+2

Tìm thấy nó, đó là 1,50 .0: http://www.boost.org/doc/libs/1_58_0/libs/filesystem/doc/release_history.html – Ela782

0

Bạn có thể tự định nghĩa toán tử + sao cho bạn có thể thêm hai biến số boost::filesystem::path.

inline boost::filesystem::path operator+(boost::filesystem::path left, boost::filesystem::path right){return boost::filesystem::path(left)+=right;} 

Sau đó, bạn thậm chí có thể thêm biến số std::string (chuyển đổi ẩn). Đây là giống với định nghĩa của operator/ từ

bao gồm/tăng/hệ thống tập tin/path.hpp:

inline path operator/(const path& lhs, const path& rhs) { return path(lhs) /= rhs; } 

Dưới đây là một ví dụ làm việc:

main.cpp:

#include <iostream> 
#include <string> 
#include <boost/filesystem.hpp> 

using namespace boost::filesystem; 
inline path operator+(path left, path right){return path(left)+=right;} 

int main() { 
    path p1 = "/base/path"; 
    path p2 = "/add/this"; 
    std::string extension=".ext"; 
    std::cout << p1+p2+extension << '\n'; 
    return 0; 
} 

biên soạn với

g++ main.cpp -lboost_system -lboost_filesystem 

sản xuất đầu ra:

$ ./a.out 
"/base/path/add/this.ext" 
Các vấn đề liên quan