วิธีการแปลงประเภทเส้นทางการเพิ่มเป็นสตริง


128

สวัสดีตอนนี้ฉันมีโปรแกรมที่ได้รับเส้นทางแบบเต็มของตำแหน่งของไฟล์และใส่ลงในตัวแปรประเภท: boost :: filesystem2 :: path

ฉันได้ค้นหาวิธีการทำสิ่งนี้และพบว่าการใช้:

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

จะแปลงเส้นทางเป็นสตริง แต่จะแปลงเฉพาะชื่อไฟล์เท่านั้น (เช่นถ้าพา ธ เป็น "C: \ name \ bobsAwesomeWordDoc.docx" ก็จะส่งคืน "bobsAwesomeWordDoc")

ฉันพบสิ่งต่อไปนี้เกี่ยวกับวิธีการแปลงเส้นทางทั้งหมดเป็นสตริง แต่ฉันไม่รู้วิธีนำไปใช้ในโปรแกรมของฉัน ฉันได้ลองหลายวิธี แต่ฉันได้รับข้อผิดพลาดในการแปลง

const std :: string & string (): รูทีนนี้จะส่งคืนสำเนาของสตริงที่เส้นทางถูกเริ่มต้นด้วยการจัดรูปแบบตามกฎไวยากรณ์ของพา ธ

(พบที่นี่ )

ฉันเหนื่อย:

string result1 = string& (myPath);

และรูปแบบอื่น ๆ อีกเล็กน้อย

คำตอบ:


165

คุณเพียงแค่ต้องโทรmyPath.string().


1
มีการรับประกันว่าสตริงส่งคืนเส้นทางที่เข้ารหัส utf8 บนทุกแพลตฟอร์มหรือไม่
Sergey Shambir

1
@SergeyShambir: ไม่น่าเสียดาย สามารถใช้ได้อย่างชัดเจนu8string()แต่ไม่ได้ช่วยให้string()ใช้งานได้โดยอัตโนมัติ
ไชโยและ hth - Alf

13

ผมเชื่อว่าคุณต้องทำเล็ก ๆ น้อย ๆ มากกว่าเพียงแค่แปลงเส้นทางไปสตริง - ครั้งแรกที่คุณควรจะได้รับรุ่นมาตรฐานของเส้นทาง - เส้นทางที่แน่นอนไม่มีองค์ประกอบสัญลักษณ์การเชื่อมโยง - และแปลงที่เป็นสตริง:

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

ป.ล. - ฉันเขียนโปรแกรมด้วย Boost มานานแล้วและหาข้อมูลนี้ในเอกสารไม่ได้ง่ายๆ


อัปเดต (ต.ค. 2017)

เอกสารประกอบ: boost :: filesystem :: canonicalเพิ่มระบบแฟ้ม

แต่โปรดทราบว่าใน C ++ 17 มีstd :: filesystemพร้อมCanonicalและอื่น ๆ อีกมากมาย


คำตอบที่ยอมรับคือทางเลือกที่ง่ายกว่ามาก (และใช้ได้ผล)
alestanis

4
canonical เลิกใช้แล้วใน Boost boost.org/doc/libs/1_48_0/libs/filesystem/v3/doc/…
Brian Jack

1
@BrianJack ฮะเลิกใช้แล้วยังไง? Sry ไม่พบบันทึกอย่างเป็นทางการใด ๆ ... ดูข้อมูลอ้างอิง 1.60: boost.org/doc/libs/1_60_0/libs/filesystem/doc/…
Marco Alka

@MarcoAlka ดูตารางที่เชื่อมโยงboost.org/doc/libs/1_48_0/libs/filesystem/v3/doc/…และสังเกตบรรทัดที่สอง: class path canonize () Function ถูกลบ - นั่นหมายความว่าครั้งหนึ่งเคยอยู่ในไลบรารี แต่ไม่มีอีกต่อไป - คำจำกัดความของการเลิกใช้งาน
Brian Jack

2
@BrianJack เป็นcanonizeลิงก์ที่เลิกใช้แล้วต่อลิงก์ที่สองของคุณ แต่canonicalดูเหมือนจะไม่เป็น (ต่อลิงก์แรกของคุณสำหรับ 1_48 V3) ตอนนี้ใน C ++ 17 เรามีstd::filesystemแน่นอน
zdim

3

สิ่งนี้ใช้ได้ใน wxWidgets: (ฉันรู้ว่าฉันควรใช้ยูทิลิตี้ wx แต่เป็นการทดสอบ)

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...      
}


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.