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