2012-04-28 9 views

Odpowiedz

30

Najprostszym sposobem jest użycie find_last_of funkcji składowej 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; 

To rozwiązanie działa zarówno z przodu i do tyłu ukośniki.

+3

Działa, zakładając, że użytkownik nigdy nie umieszcza, w zależności od tego, które zaciek jest legalne w swoich nazwach plików – Potatoswatter

+0

działa dla mnie :) dzięki! – Mat

+0

Nie działa dla mnie, ale to zrobiło http://stackoverflow.com/questions/8518743/get-directory-from-file-path-c – brad

4

użyć strrchr(), aby znaleźć ostatni ukośnik odwrotny i usunąć ciąg.

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

Co jeśli jest to ukośnik ('/')? – Cameron

5

W Windows 8, użyj PathCchRemoveFileSpec które można znaleźć w Pathcch.h

PathCchRemoveFileSpec usunie ostatni element w ścieżce, więc jeśli przejdą mu ścieżkę do katalogu, w ostatnim folderze zostaną usunięte.
Jeśli chcesz tego uniknąć, i nie masz pewności, czy ścieżka do pliku jest katalogiem, użyj PathIsDirectory

PathCchRemoveFileSpec nie zachowuje się zgodnie z oczekiwaniami na ścieżkach zawierających przodu ukośniki.

+1

Tylko na Windows 8 – Liviu

Powiązane problemy