在做移植时, 发现了 _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 WIN32 void _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 WIN32 void _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运行结果如下: