Làm thế nào để chuyển đổi loại đường dẫn boost thành chuỗi?


127

Xin chào Tôi hiện có một chương trình có đường dẫn đầy đủ về vị trí của tệp và được đặt vào một biến có dạng: boost :: filesystem2 :: path

Tôi đã tìm kiếm cách để làm điều này và đã tìm thấy rằng bằng cách sử dụng:

string result1 = boost::filesystem::basename (myPath)

sẽ chuyển đổi đường dẫn thành chuỗi NHƯNG nó chỉ chuyển đổi tên tệp (ví dụ: nếu đường dẫn là "C: \ name \ bobsAw đũaWordDoc.docx" thì nó chỉ trả về "bobsAw đũaWordDoc").

Tôi đã tìm thấy những điều sau đây về cách chuyển đổi toàn bộ đường dẫn thành chuỗi, nhưng tôi không biết cách triển khai nó trong chương trình của mình. Tôi đã thử nhiều cách nhưng tôi nhận được lỗi chuyển đổi.

const std :: string & string (): Thường trình này trả về một bản sao của chuỗi mà đường dẫn được khởi tạo, với định dạng theo các quy tắc ngữ pháp đường dẫn.

(tìm thấy ở đây )

Tôi đã thử:

string result1 = string& (myPath);

và một vài biến thể khác.

Câu trả lời:


164

Bạn chỉ cần gọi myPath.string().


1
Có đảm bảo rằng chuỗi trả về đường dẫn được mã hóa utf8 trên tất cả các nền tảng không?
Serge Shambir

1
@SergeyShambir: Thật không may. Người ta có thể sử dụng rõ ràng u8string(), nhưng điều đó không giúp ích gì khi string()được sử dụng tự động.
Chúc mừng và hth. - Alf

13

Tôi tin rằng bạn cần thực hiện nhiều hơn một chút so với việc chuyển đổi đường dẫn thành chuỗi - trước tiên bạn nên lấy phiên bản chính tắc của đường dẫn - một đường dẫn tuyệt đối không có thành phần liên kết tượng trưng - và chuyển đổi chuỗi đó thành chuỗi:

boost::filesystem::canonical(myPath).string();

Tái bút - Tôi đã lập trình với Boost từ lâu và tôi không thể dễ dàng tìm thấy thông tin này trong các tài liệu.


Cập nhật (tháng 10 năm 2017)

Tài liệu: boost :: filesystem :: canonical .

Nhưng lưu ý rằng kể từ C ++ 17, có std :: filesystem , với canonical và nhiều hơn nữa.


Câu trả lời được chấp nhận là một cách thay thế đơn giản hơn nhiều (và nó hoạt động)
alestanis

4
canonical không được dùng nữa trong các phiên bản mới hơn của Boost boost.org/doc/libs/1_48_0/libs/filesystem/v3/doc/ trộm
Brian Jack

1
@BrianJack huh, nó bị phản đối như thế nào? Sry, không thể tìm thấy bất kỳ ghi chú chính thức nào ... xem thêm 1.60 tài liệu tham khảo: boost.org/doc/libs/1_60_0/libs/filesystem/doc/iêu
Marco Alka

@MarcoAlka Xem bảng liên kết boost.org/doc/libs/1_48_0/libs/filesystem/v3/doc/... và lưu ý thứ hai dòng: lớp con đường phong thánh () Chức năng loại bỏ - điều đó có nghĩa nó đã từng trong thư viện nhưng không còn - định nghĩa không dùng nữa.
Brian Jack

2
@BrianJack Đó là sự canonizephản đối, theo liên kết thứ hai của bạn, nhưng canonicaldường như không phải (theo liên kết đầu tiên của bạn, cho 1_48 V3). Bây giờ trong C ++ 17, std::filesystemtất nhiên chúng ta có
zdim

3

Điều này hoạt động trong wxWidgets: (Tôi biết tôi chỉ nên sử dụng các tiện ích wx nhưng nó là một thử nghiệm)

void WxWidgetsBoostTestFrame::OnTestBtnClick(wxCommandEvent& event)
{
    boost::filesystem::path currentPath;
    currentPath = boost::filesystem::current_path();
    std::string curDirString;
    curDirString = boost::filesystem::canonical(currentPath).string();
    wxString mystring(curDirString.c_str(), wxConvUTF8);
    wxMessageBox(mystring); // output:  C:/Users\client\Desktop...      
}

1

Gọi myPath.generic_string()sẽ làm những gì bạn cần.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.