_splitpath 或_wsplitpath函数的使用

_tsplitpath函数能够从完整的路径中分离出盘符、目录、文件名及文件后缀等部分,适用于多种Windows系统版本。此函数通过传入全路径作为输入,并将各组成部分分别存入指定的缓冲区。

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

_tsplitpath 函数可以从路径中分解出 盘符、目录、文件名、文件后缀等。是一个非常有用的函数。

RoutineRequired headerCompatibility

_splitpath

<stdlib.h>

Windows 95, Windows 98, Windows 98 Second Edition, Windows Millennium Edition, Windows NT 4.0, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003

_wsplitpath

<stdlib.h> or <wchar.h>

Windows 95, Windows 98, Windows 98 Second Edition, Windows Millennium Edition, Windows NT 4.0, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003

函数原型:
errno_t _splitpath_s(
   const char * path, //[in]全路径
   char * drive, //[out]   驱动器号,后跟一个冒号(:),如果你不需要驱动器号,可以传递NULL
   size_t driveNumberOfElements,//[in]  
Drive的缓冲区大小(单字节或款字节),如果drive为NULL,该参数必须为0
   char * dir, //[out] 
目录路径,包括尾部的斜杠,可以使用“\”,“/”或者都使用,如果不需要目录路径,可以传递NULL
   size_t dirNumberOfElements,  //[in] 
Dir的缓冲区大小(单字节或者款字节),如果dir为NULL,该参数必须为0
   char * fname, //[out]  
不带扩展名的文件名,如果不需要文件名,可以传递NULL
   size_t nameNumberOfElements,//[in]   Fname的缓冲区大小(单字节或者宽字节),如果fname为NULL,该参数必须为0
   char * ext, //[out] 
文件的扩展名,包括“.”,如果不需要扩展名,可以传递NULL
   size_t extNumberOfElements  //[in]  
Ext的缓冲区大小(单字节或者宽字节),如果ext为NULL,该参数必须为0
);

返回值:成功返回0,失败返回错误代码 EINVAL

_splitpath_s 该函数将全路径分割成四个部分,分别是驱动器,路径名,文件名(不带扩展名),扩展名。_splitpath_s会根据当前正在使用的多字节页码来识别多字节字符来处理宽字节字符串。_wsplitpath_s是_splitpath_s的多字节版本,_wsplitpath_s的参数是宽字符。

全路径被分成四个部分分别存储在不同的缓冲区中,每个部分允许的最大值为_MAX_DRIVE, _MAX_DIR,_MAX_FNAME, and_MAX_EXT,这些宏定义在stdlib.h中,如果这四个部分的缓冲区大小超过了定义的允许的最大值,那么会引起heap corruption.

以下是四个宏的定义的最大值:

Name

Value

_MAX_DRIVE

3

_MAX_DIR

256

_MAX_FNAME

256

_Max_EXT

256


源码:
[cpp] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. TCHAR szModuleFileName[MAX_PATH] = {0}; // 全路径名  
  2.   
  3. TCHAR drive[_MAX_DRIVE] = {0}; // 盘符名称,比如说C盘啊,D盘啊  
  4.   
  5. TCHAR dir[_MAX_DIR] = {0}; // 目录  
  6.   
  7. TCHAR fname[_MAX_FNAME] = {0}; // 进程名字  
  8.   
  9. TCHAR ext[_MAX_EXT] = {0}; //后缀,一般为exe或者是dll  
  10.   
  11.   
  12. if (NULL == GetModuleFileName(NULL, szModuleFileName, MAX_PATH)) //获得当前进程的文件路径  
  13.     return _T("");  
  14.   
  15. errno_t err = _tsplitpath_s( szModuleFileName,   
  16.     drive,  
  17.     dir,  
  18.     fname,  
  19.     ext); //分割该路径,得到盘符,目录,文件名,后缀名

  err = _splitpath_s( path_buffer, drive, _MAX_DRIVE, dir, _MAX_DIR, fname,
                       _MAX_FNAME, ext, _MAX_EXT );




### C语言 `_splitpath` 函数用法及示例代码 #### 1. `_splitpath` 的功能描述 `_splitpath` 是一个用于分解文件路径的函数,能够将完整的文件路径拆分为驱动器号、目录路径、基础文件名以及扩展名四个部分[^1]。 #### 2. 头文件与参数说明 该函数声明于 `<stdlib.h>` 中。其原型如下: ```c void _splitpath( const char *path, char *drive, char *dir, char *fname, char *ext ); ``` - **`path`**: 输入参数,表示要解析的完整路径。 - **`drive`**: 输出参数,存储路径中的驱动器号(如 `C:`)。 - **`dir`**: 输出参数,存储路径中的目录部分(如 `\folder\subfolder\`)。 - **`fname`**: 输出参数,存储路径中的基本文件名(不带扩展名的部分)。 - **`ext`**: 输出参数,存储路径中的文件扩展名(包括前导的`.`)。[^2] #### 3. 示例代码展示 以下是 `_splitpath` 使用的一个典型例子: ```c #include <stdlib.h> #include <stdio.h> int main() { char path_buffer[_MAX_PATH]; char drive[_MAX_DRIVE]; char dir[_MAX_DIR]; char fname[_MAX_FNAME]; char ext[_MAX_EXT]; // 创建一个路径字符串 _makepath(path_buffer, "C", "\\Users\\ExampleUser\\Documents\\", "example_file", ".txt"); printf("Path created with _makepath: %s\n", path_buffer); // 将路径分解成各个组成部分 _splitpath(path_buffer, drive, dir, fname, ext); printf("Path extracted with _splitpath:\n"); printf("Drive: %s\n", drive); // 驱动器号 printf("Dir: %s\n", dir); // 目录路径 printf("Filename: %s\n", fname); // 文件名 printf("Ext: %s\n", ext); // 扩展名 return 0; } ``` 运行以上程序会输出类似以下的结果: ``` Path created with _makepath: C:\Users\ExampleUser\Documents\example_file.txt Path extracted with _splitpath: Drive: C: Dir: \Users\ExampleUser\Documents\ Filename: example_file Ext: .txt ``` 此代码展示了如何通过 `_makepath` 构造一个路径,并利用 `_splitpath` 对其进行分解[^4]。 #### 4. Linux 平台上的简单实现 由于 `_splitpath` 属于 Windows 特定 API,在 Linux 其他平台上可能不可用。下面是一个简单的跨平台替代方案[^3]: ```c #include <string.h> #include <stdio.h> void _splitpath(const char *path, char *drive, char *dir, char *fname, char *ext) { strcpy(drive, ""); // 默认无驱动器号 strcpy(ext, ""); // 查找最后一个斜杠位置 const char *last_slash = strrchr(path, '/'); if (!last_slash) last_slash = strrchr(path, '\\'); if (last_slash) { strncpy(dir, path, last_slash - path + 1); dir[last_slash - path + 1] = '\0'; strcpy(fname, last_slash + 1); } else { dir[0] = '\0'; strcpy(fname, path); } // 查找最后一点作为扩展名分隔符 const char *dot = strrchr(fname, '.'); if (dot && dot != fname) { size_t len = strlen(fname); memcpy(ext, dot, len - (dot - fname)); ext[len - (dot - fname)] = '\0'; *(dot) = '\0'; // 截断文件名为纯名称 } } int main() { char path[] = "/home/user/example_file.txt"; char drive[5], dir[256], fname[256], ext[256]; _splitpath(path, drive, dir, fname, ext); printf("Drive: %s\n", drive); printf("Dir: %s\n", dir); printf("Filename: %s\n", fname); printf("Ext: %s\n", ext); return 0; } ``` 这段代码实现了类似的路径分解逻辑,适用于类 Unix 系统环境。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值