Tôi cóC++ làm thế nào để loại bỏ tên tập tin từ đường dẫn chuỗi
const char *pathname = "..\somepath\somemorepath\somefile.ext";
làm thế nào để chuyển đổi đó vào
"..\somepath\somemorepath"
?
Tôi cóC++ làm thế nào để loại bỏ tên tập tin từ đường dẫn chuỗi
const char *pathname = "..\somepath\somemorepath\somefile.ext";
làm thế nào để chuyển đổi đó vào
"..\somepath\somemorepath"
?
Cách đơn giản nhất là sử dụng chức năng find_last_of
viên của std::string
string s1("../somepath/somemorepath/somefile.ext");
string s2("..\\somepath\\somemorepath\\somefile.ext");
cout << s1.substr(0, s1.find_last_of("\\/")) << endl;
cout << s2.substr(0, s2.find_last_of("\\/")) << endl;
giải pháp này làm việc với cả hai dấu gạch chéo và ngược lại.
Nó hoạt động giả sử người dùng không bao giờ đặt bất kỳ dấu gạch chéo là hợp pháp vào tên tập tin của mình – Potatoswatter
làm việc cho tôi :) cảm ơn! – Mat
Đã không làm việc cho tôi, nhưng điều này đã làm http://stackoverflow.com/questions/8518743/get-directory-from-file-path-c – brad
sử dụng strrchr()
để tìm dấu gạch chéo ngược cuối cùng và xóa chuỗi.
char *pos = strrchr(pathname, '\\');
if (pos != NULL) {
*pos = '\0'; //this will put the null terminator here. you can also copy to another string if you want
}
Điều gì sẽ xảy ra nếu đó là dấu gạch chéo chuyển tiếp ('/')? – Cameron
Trên Windows sử dụng _splitpath()
và trên Linux sử dụng dirname()
Trên Windows 8, sử dụng PathCchRemoveFileSpec
có thể được tìm thấy trong Pathcch.h
PathCchRemoveFileSpec
sẽ loại bỏ các yếu tố cuối cùng trong một con đường, vì vậy nếu bạn vượt qua nó một đường dẫn thư mục, thư mục cuối cùng sẽ bị tước.
Nếu bạn muốn tránh điều này, và bạn không chắc chắn nếu một đường dẫn tập tin là một thư mục, sử dụng PathIsDirectory
PathCchRemoveFileSpec
không như mong đợi trên những con đường có chứa tiền đạo slashes.
Chỉ trên Windows 8 – Liviu
Tăng cấp có lớp 'hệ thống tập tin :: đường dẫn' tốt đẹp ... – Cameron