_makepath_s, _wmakepath_s
创建从元素的路径名称。这些是 _makepath, _wmakepath 的版本与安全增强的 CRT中的安全功能如中所述。
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++ only
template <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
包含实际文件扩展名,有或没有驱动的句点 ()。_makepath_s 插入自动内,如果不出现在 ext。如果 ext 是 NULL 或指向一个空字符串,扩展在聚合 path 字符串中插入。
返回值
零,如果成功;在失败的错误代码。
错误状态
path |
sizeInWords / sizeInBytes |
Return |
path内容 |
---|---|---|---|
NULL |
任何 |
EINVAL |
不修改 |
任何 |
AMP_LT= 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++ 中,使用这些功能由模板重载简化;重载可推断缓冲区长度 (自动不再需要指定范围参数),并且还可以用以较新,安全重复自动替换旧,不安全的功能。有关更多信息,请参见 安全模板重载。
这些函数的 " debug " 版本用 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.c
Path extracted with _splitpath_s:
Drive: c:
Dir: \sample\crt\
Filename: crt_makepath_s
Ext: .c