_splitpath_s、_wsplitpath_s

Breaks a path name into components. These are versions of _splitpath, _wsplitpath with security enhancements as described in CRT 中的安全功能.

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
);
template <size_t drivesize, size_t dirsize, size_t fnamesize, size_t extsize>
errno_t _splitpath_s(
   const char *path,
   char (&drive)[drivesize],
   char (&dir)[dirsize],
   char (&fname)[fnamesize],
   char (&ext)[extsize]
); // C++ only
template <size_t drivesize, size_t dirsize, size_t fnamesize, size_t extsize>
errno_t _wsplitpath_s(
   const wchar_t *path,
   wchar_t (&drive)[drivesize],
   wchar_t (&dir)[dirsize],
   wchar_t (&fname)[fnamesize],
   wchar_t (&ext)[extsize]
); // C++ only

参数

  • [in] path
    Full path.

  • [out] drive
    Drive letter, followed by a colon (:). You can pass NULL for this parameter if you do not need the drive letter.

  • [in] driveNumberOfElements
    The size of the drive buffer in single-byte or wide characters. 如果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。

返回值

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

错误情况

条件

返回值

path 为 NULL

EINVAL

drive 为 NULL,则 driveNumberOfElements 为非零

EINVAL

drive 为非 NULL,则 driveNumberOfElements 为零

EINVAL

dir 为 NULL,则 dirNumberOfElements 为非零

EINVAL

dir 为非 NULL,则 dirNumberOfElements 为零

EINVAL

fname 为 NULL,则 nameNumberOfElements 为非零

EINVAL

fname 为非 NULL,则 nameNumberOfElements 为零

EINVAL

ext 为 NULL,则 extNumberOfElements 为非零

EINVAL

ext 为非 NULL,则 extNumberOfElements 为零

EINVAL

如果任何以上状态发生,调用无效参数处理程序,正如 参数验证 所述。 如果允许继续执行,则这些函数将 errno 设置为 EINVAL,并返回EINVAL。

如果任何缓冲区太短而无法存储结果,则这些函数清除所有缓冲区为空字符串,将 errno 设置为 ERANGE,并返回 ERANGE。

备注

_splitpath_s 函数将路径分解成四个部分。 _splitpath_s 它们自动处理合适的多字节字符串参数,根据当前使用的多字节代码页识别多字节字符序列. _wsplitpath_s_splitpath_s 的宽字符版本;_wsplitpath_s 的参数是宽字符串。 否则这些函数具有相同行为。

一般文本例程映射

TCHAR.H 例程

未定义的 _UNICODE& 和 _MBCS

已定义 _MBCS

已定义 _UNICODE

_tsplitpath_s

_splitpath_s

_splitpath_s

_wsplitpath_s

完整路径的每个组件存储在单独的缓冲区中;清单常数 _MAX_DRIVE、_MAX_DIR、_MAX_FNAME和 _MAX_EXT (定义在 STDLIB.H) 指定每个文件组件的最大允许大小。 大于对应的清单常数的文件组件造成堆损坏。

下表列出了清单常数的值。

名称

_MAX_DRIVE

3

_MAX_DIR

256

_MAX_FNAME

256

_MAX_EXT

256

如果没有完整路径不包含组件 (例如,文件名), _splitpath_s 将空字符串分配给对应的缓冲区。

在 C++ 中,使用这些函数是由重载模板简化;该重载可以自动推断缓冲区长度,而无需指定范围参数。 有关更多信息,请参见安全模板重载

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

要求

例程

必需的标头

_splitpath_s

<stdlib.h>

_wsplitpath_s

<stdlib.h> 或 <wchar.h>

有关其他兼容性信息,请参见“简介”中的兼容性

示例

请参见 _makepath_s、_wmakepath_s中的示例。

.NET Framework 等效项

不适用。若要调用标准 C 函数,请使用 PInvoke。有关更多信息,请参见平台调用示例

请参见

参考

文件处理

_splitpath、_wsplitpath

_fullpath、_wfullpath

_getmbcp

_makepath、_wmakepath

_setmbcp