2011-04-19 64 views
3

我需要從文件中獲取父目錄在C++:獲取父目錄中的C++

例如:

輸入:

D:\Devs\Test\sprite.png 

輸出:

D:\Devs\Test\ [or D:\Devs\Test] 

我可以用一個功能做到這一點:

char *str = "D:\\Devs\\Test\\sprite.png"; 
for(int i = strlen(str) - 1; i>0; --i) 
{ 
    if(str[i] == '\\') 
    { 
     str[i] = '\0'; 
     break; 
    } 
} 

但是,我只是想知道存在一個內置函數。 我使用VC++ 2003.

在此先感謝。

回答

1

編輯常量字符串是未定義的行爲,因此宣佈類似如下:

char str[] = "D:\\Devs\\Test\\sprite.png"; 

您可以使用以下1個襯墊讓你期望的結果:

*(strrchr(str, '\\') + 1) = 0; // put extra NULL check before if path can have 0 '\' also 
10

如果您使用的std :: string而不是C風格的字符數組,您可以按以下方式使用string::find_last_ofstring::substr

std::string str = "D:\\Devs\\Test\\sprite.png"; 
str = str.substr(0, str.find_last_of("/\\")); 
4

重型和跨平臺方式將使用boost::filesystem::parent_path()。但顯然這增加了你可能不想要的開銷。

另外,您可以利用的CString的strrchr功能是這樣的:

include <cstring> 
char * lastSlash = strrchr(str, '\\'); 
if (*lastSlash != '\n') *(lastSlash +1) = '\n'; 
1

在POSIX兼容的系統(* nix中)沒有此dirname(3)一個常用的功能。在窗戶上有_splitpath

_splitpath函數將路徑 分爲四個部分。

void _splitpath(
    const char *path, 
    char *drive, 
    char *dir, 
    char *fname, 
    char *ext 
); 

所以結果(這是什麼,我認爲你正在尋找)將在dir

下面是一個例子:

int main() 
{ 
    char *path = "c:\\that\\rainy\\day"; 
    char dir[256]; 
    char drive[8]; 
    errno_t rc; 


    rc = _splitpath_s(
     path,  /* the path */ 
     drive,  /* drive */ 
     8,   /* drive buffer size */ 
     dir,  /* dir buffer */ 
     256,  /* dir buffer size */ 
     NULL,  /* filename */ 
     0,   /* filename size */ 
     NULL,  /* extension */ 
     0   /* extension size */ 
    ); 

    if (rc != 0) { 
     cerr << GetLastError(); 
     exit (EXIT_FAILURE); 
    } 

    cout << drive << dir << endl; 
    return EXIT_SUCCESS; 
} 
-1

您可以使用目錄名來獲取父目錄 檢查這個link更多信息

Raghu