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

请参见

参考

文件处理

fopen、_wfopen

_getmbcp

_getpid

_open、_wopen

_setmbcp

_tempnam、_wtempnam、tmpnam、_wtmpnam

tmpfile_s