windows 上的 _splitpath 函数在 linux 平台下的简单实现

本文详细介绍了在Linux环境下如何实现_splitpath函数,用于分解路径为磁盘驱动、目录、文件名和扩展名等部分。通过示例代码展示了函数的具体实现方式,并提供了测试结果验证其正确性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章转载至:https://blog.youkuaiyun.com/a_ran/article/details/41551955

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

运行结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值