_splitpath 或_wsplitpath函数的使用

_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 );




`_splitpath` 是一个 C/C++ 标准库函数,用于将文件路径分解成文件名、目录路径和文件扩展名等部分。它的原型定义如下: ```c++ void _splitpath( const char * path, char * drive, char * dir, char * fname, char * ext ); ``` 参数说明: - `path`:要分解的文件路径。 - `drive`:指向存储驱动器号的缓冲区的指针。如果路径中没有驱动器号,则此参数返回空字符串。 - `dir`:指向存储目录路径的缓冲区的指针。如果路径中没有目录,则此参数返回空字符串。 - `fname`:指向存储文件名的缓冲区的指针。如果路径中没有文件名,则此参数返回空字符串。 - `ext`:指向存储文件扩展名的缓冲区的指针。如果路径中没有扩展名,则此参数返回空字符串。 `_splitpath` 函数分解路径的方式与操作系统有关,Windows 系统下的路径分解方式如下: - 路径以驱动器号开头,则将驱动器号分配给 `drive` 参数,`dir` 参数包含路径中的所有目录,但不包括驱动器号。 - 路径不以驱动器号开头,但以斜杠反斜杠字符开头,则将根目录分配给 `dir` 参数,`drive` 参数为空字符串。 - 如果路径中有文件名,则 `_splitpath` 函数将文件名分配给 `fname` 参数,如果还有扩展名,则将扩展名分配给 `ext` 参数。 下面是一个使用 `_splitpath` 函数的示例: ```c++ #include <stdio.h> #include <stdlib.h> #include <string.h> #include <io.h> void print_path_parts(const char* path) { char drive[_MAX_DRIVE]; char dir[_MAX_DIR]; char fname[_MAX_FNAME]; char ext[_MAX_EXT]; _splitpath(path, drive, dir, fname, ext); printf("Drive: %s\n", drive); printf("Dir: %s\n", dir); printf("Filename: %s\n", fname); printf("Extension: %s\n", ext); } int main() { const char* path = "C:\\Program Files\\Microsoft Visual Studio\\2019\\Community\\VC\\Tools\\MSVC\\14.29.30133\\bin\\Hostx64\\x64\\cl.exe"; print_path_parts(path); return 0; } ``` 输出结果如下: ``` Drive: C: Dir: \Program Files\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.29.30133\bin\Hostx64\x64\ Filename: cl Extension: .exe ``` 可以看到,该程序将路径分解成了驱动器号、目录路径、文件名和文件扩展名四部分,分别存储在 `drive`、`dir`、`fname` 和 `ext` 变量中,并打印输出。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值