2012-04-28 32 views

Trả lời

30

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.

+3

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

+0

làm việc cho tôi :) cảm ơn! – Mat

+0

Đã 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

4

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 
} 
+2

Điều gì sẽ xảy ra nếu đó là dấu gạch chéo chuyển tiếp ('/')? – Cameron

5

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.

+1

Chỉ trên Windows 8 – Liviu

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