_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。有关更多信息,请参见平台调用示例。