標籤:windows 移植 linux _splitpath splitpath
在做移植時, 發現了 _splitpath 在 linux 下是沒有的,於是決定自己寫下,也不難。
首先百科到如下內容:
聲明定義void _splitpath( const char *path, char *drive, char *dir, char *fname, char *ext );說明分解路徑,把你的完整路徑給分割開來,就是一個對字串進行分割的函數參數表path, Full path(完整路徑)drive , Optional drive letter, followed by a colon (:)(磁碟驅動包含:)dir, Optional directory path, including trailing slash. Forward slashes (/ ), backslashes (\ ), or both may be used.(檔案路徑,無論是以“/”,“\”)fname, Base filename (no extension)(檔案名稱)ext , Optional filename extension, including leading period (.)(尾碼名)----------------------------------------
分割線出沒,請小心 --------------------------------------------
Linux 下實現及測試代碼如下:
#include <stdio.h>#include <string.h>#ifndef WIN32void _splitpath(const char *path, char *drive, char *dir, char *fname, char *ext);static void _split_whole_name(const char *whole_name, char *fname, char *ext);#endif/* main test */int main(void){char *path = "/home/test/dir/f123.txt";// char *path = "/home/test/dir/123.txt";// char *path = "/home/test/dir/123";// char *path = "123";// char *path = "123.txt";char drive[128];char dir[128];char fname[128];char ext[128];_splitpath(path, drive, dir, fname, ext);printf("path = %s\n", path);printf("dir = %s\n", dir);printf("fname = %s\n", fname);printf("ext = %s\n", ext);return 0;}#ifndef WIN32void _splitpath(const char *path, char *drive, char *dir, char *fname, char *ext){char *p_whole_name;drive[0] = '\0';if (NULL == path){dir[0] = '\0';fname[0] = '\0';ext[0] = '\0';return;}if ('/' == path[strlen(path)]){strcpy(dir, path);fname[0] = '\0';ext[0] = '\0';return;}p_whole_name = rindex(path, '/');if (NULL != p_whole_name){p_whole_name++;_split_whole_name(p_whole_name, fname, ext);snprintf(dir, p_whole_name - path, "%s", path);}else{_split_whole_name(path, fname, ext);dir[0] = '\0';}}static void _split_whole_name(const char *whole_name, char *fname, char *ext){char *p_ext;p_ext = rindex(whole_name, '.');if (NULL != p_ext){strcpy(ext, p_ext);snprintf(fname, p_ext - whole_name + 1, "%s", whole_name);}else{ext[0] = '\0';strcpy(fname, whole_name);}}#endif
運行結果如下:
windows 上的 _splitpath 函數在 linux 平台下的簡單實現