_mktemp_s、_wmktemp_s
创建唯一的文件名。 _mktemp、_wmktemp 的一些版本提供安全增强功能(如 CRT 中的安全功能所述)。
errno_t _mktemp_s(
char *template,
size_t sizeInChars
);
errno_t _wmktemp_s(
wchar_t *template,
size_t sizeInChars
);
template <size_t size>
errno_t _mktemp_s(
char (&template)[size]
); // C++ only
template <size_t size>
errno_t _wmktemp_s(
wchar_t (&template)[size]
); // C++ only
参数
template
文件名模式。sizeInChars
在 _mktemp_s单字节字符缓冲区的大小; _wmktemp_s中宽字符,其中包括空终结器。
返回值
成功时这两个函数返回零;失败时返回错误代码。
错误情况
template |
sizeInChars |
返回值 |
模板的新值 |
---|---|---|---|
NULL |
any |
EINVAL |
NULL |
不正确的格式 (参见 Remarks 节中正确的格式) |
any |
EINVAL |
空字符串 |
any |
<= X's 的数字 |
EINVAL |
空字符串 |
如果任一以上错误状态发生,调用无效参数句柄,如 参数验证所述。 如果允许继续执行,将 EINVAL 设置为 errno,并函数返回 EINVAL。
备注
_mktemp_s 函数通过修改 template 参数创建唯一文件名,因此,在调用后,template指针指向一个包含新的文件名之后的字符串的指针。 _mktemp_s 自动处理合适的多字节字符串参数,通过运行时系统根据当前使用的多字节代码页识别多字节字符序列. _wmktemp_s 是 _mktemp_s 的宽字符版本;_wmktemp_s 的参数是宽字符串。 _wmktemp_s 和 _mktemp_s 具有相同的行为,但 _wmktemp_s 不处理多字节字符字符串。
一般文本例程映射
Tchar.h 例程 |
未定义 _UNICODE 和 _MBCS |
已定义 _MBCS |
已定义 _UNICODE |
---|---|---|---|
_tmktemp_s |
_mktemp_s |
_mktemp_s |
_wmktemp_s |
template 参数包含窗体 baseXXXXXX,base 是新的文件名部分来提供,并且每个 x 为 _mktemp_s提供的字符的占位符。 template 中的每个占位符字符必须是大写 X。 _mktemp_s 保留 base 并替换字母表的第一个尾随 X。 _mktemp_s 用五位数值替换以下跟踪 X's;此值是一个调用进程唯一标示符,或在多线程程序中,调用线程。
对 _mktemp_s 的每次成功的调用修改 template。 在每一个后来调用的相同进程或线程的有和 template一样的参数,_mktemp_s 检查文件名匹配以前的调用 _mktemp_s 返回的名称。 如果给定名称的文件不存在, _mktemp_s 返回名称。 如果文件存在所有先前返回的名字,_mktemp_s 通过替换字母创建一个新名字。先前返回名字与下一个可用小写字母,按顺序,从“a”到“z”。 例如,如果 base:
fn
而 _mktemp_s 提供五位数的值为 12345,则返回的名称为:
fna12345
如果该名称用于创建文件 FNA12345,且此文件保存,调用从相同的进程或线程返回名字使和 base template 的是:
fnb12345
如果 FNA12345 不存在,再一次返回下一个名字:
fna12345
_mktemp_s 可以从任何给定的基本和模板特定值的所有组合创建最多 26 个唯一的文件名。 因此,FNZ12345 是最后唯一文件名 _mktemp_s 可为 base 和 template 在实例中创建值。
在 C++ 中,使用这些函数由模板重载简化;重载可以自动推导出缓冲区长度 (不再需要指定大小参数),并且它们可以自动用以更新、更安全的对应物替换旧的、不安全的函数。 有关更多信息,请参见安全模板重载。
要求
例程 |
必需的标头 |
---|---|
_mktemp_s |
<io.h> |
_wmktemp_s |
<io.h> or <wchar.h> |
有关更多兼容性信息,请参见“简介”中的兼容性。
示例
// crt_mktemp_s.cpp
/* The program uses _mktemp to create
* five unique filenames. It opens each filename
* to ensure that the next name is unique.
*/
#include <io.h>
#include <string.h>
#include <stdio.h>
char *fnTemplate = "fnXXXXXX";
char names[5][9];
int main()
{
int i, err, sizeInChars;
FILE *fp;
for( i = 0; i < 5; i++ )
{
strcpy_s( names[i], sizeof(names[i]), fnTemplate );
/* Get the size of the string and add one for the null terminator.*/
sizeInChars = strnlen(names[i], 9) + 1;
/* Attempt to find a unique filename: */
err = _mktemp_s( names[i], sizeInChars );
if( err != 0 )
printf( "Problem creating the template" );
else
{
if( fopen_s( &fp, names[i], "w" ) == 0 )
printf( "Unique filename is %s\n", names[i] );
else
printf( "Cannot open %s\n", names[i] );
fclose( fp );
}
}
return 0;
}
示例输出
Unique filename is fna03188
Unique filename is fnb03188
Unique filename is fnc03188
Unique filename is fnd03188
Unique filename is fne03188
.NET Framework 等效项
不适用。若要调用标准 C 函数,请使用 PInvoke。有关更多信息,请参见平台调用示例。