首页 > 代码库 > _tsplitpath_s(分解路径) _tmakepath_s(创建路径)

_tsplitpath_s(分解路径) _tmakepath_s(创建路径)

函数原型:

 

函数原型:
errno_t _splitpath_s(
   const char * path,
   char * drive,
   size_t driveNumberOfElements,
   char * dir,
   size_t dirNumberOfElements,
   char * fname,
   size_t nameNumberOfElements,
   char * ext,
   size_t extNumberOfElements
);
errno_t _wsplitpath_s(
   const wchar_t * path,
   wchar_t * drive,
   size_t driveNumberOfElements,
   wchar_t *dir,
   size_t dirNumberOfElements,
   wchar_t * fname,
   size_t nameNumberOfElements,
   wchar_t * ext,
   size_t extNumberOfElements
); 

参数:

[in] path

  全路径

[out] drive

  驱动器号,后跟一个冒号(:),如果你不需要驱动器号,可以传递NULL

[in] driveNumberOfElements

   Drive的缓冲区大小(单字节或款字节),如果drive为NULL,该参数必须为0

[out] dir

   目录路径,包括尾部的斜杠,可以使用“\”,“/”或者都使用,如果不需要目录路径,可以传递NULL

[in] dirNumberOfElements

   Dir的缓冲区大小(单字节或者款字节),如果dir为NULL,该参数必须为0

[out] fname

   不带扩展名的文件名,如果不需要文件名,可以传递NULL

[in] nameNumberOfElements

   Fname的缓冲区大小(单字节或者宽字节),如果fname为NULL,该参数必须为0

[out] ext

   文件的扩展名,包括“.”,如果不需要扩展名,可以传递NULL

[in] extNumberOfElements

   Ext的缓冲区大小(单字节或者宽字节),如果ext为NULL,该参数必须为0

 

返回值:

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

错误的情况有:

Condition

Return Value

path is NULL

EINVAL

drive is NULL, driveNumberOfElements is non-zero

EINVAL

drive is non-NULL, driveNumberOfElements is zero

EINVAL

dir is NULL, dirNumberOfElements is non-zero

EINVAL

dir is non-NULL, dirNumberOfElements is zero

EINVAL

fname is NULL, nameNumberOfElements is non-zero

EINVAL

fname is non-NULL, nameNumberOfElements is zero

EINVAL

ext is NULL, extNumberOfElements is non-zero

EINVAL

ext is non-NULL, extNumberOfElements is zero

EINVAL

任何一个指针指向空,那么对应的缓冲区必须为0,否者调用失败,返回EINVAL。

如果任何一个缓冲区太短而无法包含结果,那么该函数会清空所有缓冲区指向空。设置errno 为ERANGE,并返回ERANGE。

注意:

_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

如果全路径中缺少一个部分(例如没有文件名)_splitpath_s会为对应的缓冲区赋值为空。

头文件:

Routine

Required haerd

_splitpath_s

<stdlib.h>

_wsplitpath_s

<stdlib.h> or <wchar.h>

// tchar.h 中的宏定义

#define _tsplitpath     _splitpath

#define _tsplitpath_s   _splitpath_s

 

代码例子:

 

void MXSPLITPATH_S(const TCHAR* szFullPath, TCHAR* szDrive, TCHAR* szDir, TCHAR* szFileName, TCHAR* szExt)   

  1. {  
  2. #if (_MSC_VER > 1310) // VS2005   
  3.     _splitpath_s(szFullPath, szDrive, szDrive ? _MAX_DRIVE : 0,  
  4.         szDir, szDir ? _MAX_DIR : 0, szFileName,  
  5.         szFileName ? _MAX_FNAME : 0, szExt, szExt ? _MAX_EXT : 0);  
  6. #else   
  7.     _splitpath(szFullPath, szDrive, szDir, szFileName, szExt);  
  8. #endif   
  9. }  

 

_makepath_s、_wmakepath_s

从组件创建路径名。  

errno_t _makepath_s(   char *path,   size_t sizeInBytes,   const char *drive,   const char *dir,   const char *fname,   const char *ext );errno_t _wmakepath_s(   wchar_t *path,   size_t sizeInWords,   const wchar_t *drive,   const wchar_t *dir,   const wchar_t *fname,   const wchar_t *ext );template <size_t size>errno_t _makepath_s(   char (&path)[size],   const char *drive,   const char *dir,   const char *fname,   const char *ext ); // C++ onlytemplate <size_t size>errno_t _wmakepath_s(   wchar_t (&path)[size],   const wchar_t *drive,   const wchar_t *dir,   const wchar_t *fname,   const wchar_t *ext ); // C++ only
参数

[out] path

完整路径缓冲区。

[in] sizeInWords

缓冲区的字大小。

[in] sizeInBytes

缓冲区的大小(以字节为单位)。

[in] drive

包含与预期驱动器和一个选项尾部冒号对应的字母(A,B 等) 。 如果它丢失,_makepath_s 在复合路径自动插入冒号。 如果 drive 是NULL 或指向空字符串,在复合 path 字符串不显示驱动器号。

[in] dir

包含目录路径,不包括驱动器指示符或实际的文件名。 尾部斜杠是可选的,并且,对于一个正斜杠 (/) 和反斜杠 (\) 或两者都可能用在单个 dir 参数中。 如果尾部斜杠 (\或/) 未指定,它被自动插入。 如果 dir 是NULL 或指向空字符串,则在复合 path 字符串中不插入目录路径。

[in] fname

包含无任何文件扩展名的基文件名。 如果 fname 是NULL 或指向空字符串,则在复合 path 字符串中不插入文件名。

[in] ext

包含实际文件扩展名,带或不带前导的句点 (.)。 如果不出现在 ext,_makepath_s 会自动插入时间。 如果 ext 是NULL 或指向空字符串,则在复合 path 字符串中不插入扩展。

返回值

如果成功,则为零;如果失败,则为错误代码。

错误情况

path

sizeInWords / sizeInBytes

返回

path 的内容

NULL

any

EINVAL

未修改

any

<= 0

EINVAL

未修改

如果任一以上错误状态发生,这些函数调用无效参数句柄,如 参数验证所述。 如果允许执行继续,将errno 设置为EINVAL,并且函数返回EINVAL. NULL 允许参数 drive、fname和 ext。 当这些参数是 null 指针或空字符串时,有关行为的信息,请参见"备注"一节。

备注

_makepath_s 函数在单个组件中创建复合路径字符串,在path中存储结果。 path 可以包括驱动器号、目录路径、文件名和文件名扩展。 _wmakepath_s_makepath_s 的宽字符版本;_wmakepath_s 的参数是宽字符串。 _wmakepath_s_makepath_s 行为相同,否则。

一般文本例程映射

Tchar.h 例程

未定义 _UNICODE 和 _MBCS

已定义 _MBCS

已定义 _UNICODE

_tmakepath_s

_makepath_s

_makepath_s

_wmakepath_s

参数 path 必须指向足够大空缓冲区以容纳完整路径。 复合 path 必须大于 _MAX_PATH 常数,在 Stdlib.h中定义。

如果路径是 NULL,则将调用无效参数处理程序,如参数验证所述。 此外,将errno 设置为 EINVAL。 NULL 值允许所有其他参数。

在 C++ 中,使用这些函数由模板重载简化;重载可以自动推导出缓冲区长度 (不再需要指定大小参数),并且它们可以自动用以更新、更安全的对应物替换旧的、不安全的函数。 有关更多信息,请参见安全模板重载。

这些函数的调试版本首先用 0xFD 填充缓冲区。 若要禁用此行为,请使用 _CrtSetDebugFillThreshold。

要求

 

例程

必需的标头

_makepath_s

<stdlib.h>

_wmakepath_s

<stdlib.h> 或 <wchar.h>

示例

 
复制
// crt_makepath_s.c#include <stdlib.h>#include <stdio.h>int main( void ){   char path_buffer[_MAX_PATH];   char drive[_MAX_DRIVE];   char dir[_MAX_DIR];   char fname[_MAX_FNAME];   char ext[_MAX_EXT];   errno_t err;   err = _makepath_s( path_buffer, _MAX_PATH, "c", "\\sample\\crt\\",                      "crt_makepath_s", "c" );   if (err != 0)   {      printf("Error creating path. Error code %d.\n", err);      exit(1);   }   printf( "Path created with _makepath_s: %s\n\n", path_buffer );   err = _splitpath_s( path_buffer, drive, _MAX_DRIVE, dir, _MAX_DIR, fname,                       _MAX_FNAME, ext, _MAX_EXT );   if (err != 0)   {      printf("Error splitting the path. Error code %d.\n", err);      exit(1);   }   printf( "Path extracted with _splitpath_s:\n" );   printf( "  Drive: %s\n", drive );   printf( "  Dir: %s\n", dir );   printf( "  Filename: %s\n", fname );   printf( "  Ext: %s\n", ext );}
Output

 
复制
Path created with _makepath_s: c:\sample\crt\crt_makepath_s.cPath extracted with _splitpath_s:  Drive: c:  Dir: \sample\crt  Filename: crt_makepath_s  Ext: .c