Compartilhar via


_mktemp_s, _wmktemp_s

Cria um nome de arquivo exclusivo. Estas funções são versões de _mktemp, _wmktemp com aprimoramentos de segurança, conforme descrito em Recursos de segurança no CRT.

Sintaxe

errno_t _mktemp_s(
   char *nameTemplate,
   size_t sizeInChars
);
errno_t _wmktemp_s(
   wchar_t *nameTemplate,
   size_t sizeInChars
);
template <size_t size>
errno_t _mktemp_s(
   char (&nameTemplate)[size]
); // C++ only
template <size_t size>
errno_t _wmktemp_s(
   wchar_t (&nameTemplate)[size]
); // C++ only

Parâmetros

nameTemplate
Padrão de nome de arquivo.

sizeInChars
Tamanho do buffer em caracteres de byte único no _mktemp_s, caracteres largos em _wmktemp_s, incluindo o terminador nulo.

Valor retornado

Ambas as funções retornam zero em caso de êxito, um código de erro em caso de falha.

Condições de erro

nameTemplate sizeInChars Valor retornado Novo valor em nameTemplate
NULL any EINVAL NULL
Formato incorreto (consulte a seção Comentários para o formato correto) any EINVAL cadeia de caracteres vazia
any <= número de X caracteres EINVAL cadeia de caracteres vazia

Se qualquer uma das condições de erro acima ocorrer, o manipulador de parâmetro inválido será invocado, conforme descrito em Validação de parâmetro. Se a execução tiver permissão para continuar, errno será definido como EINVAL e as funções retornarão EINVAL.

Comentários

A função _mktemp_s cria um nome de arquivo exclusivo modificando o argumento nameTemplate, para que depois da chamada o ponteiro nameTemplate aponte para uma cadeia de caracteres que contém o novo nome de arquivo. _mktemp_s manipula automaticamente argumentos de cadeia de caracteres multibyte conforme apropriado, reconhecendo sequências de caracteres multibyte de acordo com a página de código multibyte que está sendo usada no momento pelo sistema de tempo de execução. _wmktemp_s é uma versão de caractere largo de _mktemp_s, o argumento de _wmktemp_s é uma cadeia de caracteres largos. _wmktemp_s e _mktemp_s se comportar de forma idêntica de outra forma, exceto que _wmktemp_s não lida com cadeias de caracteres multibyte.

As versões de biblioteca de depuração dessas funções preenchem o buffer com 0xFE. Para desabilitar esse comportamento, use _CrtSetDebugFillThreshold.

Por padrão, o estado global dessa função tem como escopo o aplicativo. Para alterar esse comportamento, confira Estado global no CRT.

Mapeamentos de rotina de texto genérico

Rotina Tchar.h _UNICODE e _MBCS não definidos _MBCS definido _UNICODE definido
_tmktemp_s _mktemp_s _mktemp_s _wmktemp_s

O argumento nameTemplate tem o formato baseXXXXXX, em que base é a parte do novo nome de arquivo que você fornece e cada X é um espaço reservado para um caractere fornecido pelo _mktemp_s. Cada caractere de espaço reservado em nameTemplate deve ser um X maiúsculo. _mktemp_s preserva base e substitui o primeiro X à direita por um caractere alfabético. _mktemp_s substitui os caracteres X que se seguem por um valor de cinco dígitos. Esse valor é um número exclusivo que identifica o processo de chamada ou, em programas multithread, o thread de chamada.

Cada chamada bem-sucedida para _mktemp_s modifica nameTemplate. Em cada chamada subsequente do mesmo processo ou thread com o mesmo argumento nameTemplate, _mktemp_s verifica os nomes de arquivos que correspondem aos nomes retornados por _mktemp_s em chamadas anteriores. Se não existir nenhum arquivo para um determinado nome, _mktemp_s retornará esse nome. Se existirem arquivos para todos os nomes retornados anteriormente, o _mktemp_s criará um novo nome substituindo o caractere alfabético que ele usou no nome retornado anteriormente pela próxima letra em minúscula disponível, em ordem, de 'a' a 'z'. Por exemplo, se base for:

fn

e o valor de cinco dígitos fornecido pelo _mktemp_s for 12345, o primeiro nome retornado será:

fna12345

Se esse nome for usado para criar o arquivo FNA12345 e esse nome de arquivo já existir, o próximo nome retornado em uma chamada do mesmo processo ou thread com o mesmo base para nameTemplate será:

fnb12345

Se FNA12345 não existir, o próximo nome retornado será novamente:

fna12345

_mktemp_s pode criar um máximo de 26 nomes de arquivo exclusivos para qualquer combinação de base e nameTemplate valores. Portanto, FNZ12345 é o último nome de arquivo exclusivo que _mktemp_s pode criar para os valores base e nameTemplate usados neste exemplo.

Em C++, o uso dessas funções é simplificado pelas sobrecargas de modelo; as sobrecargas podem inferir o tamanho do buffer automaticamente (eliminando a necessidade de especificar um argumento de tamanho) e podem substituir automaticamente funções mais antigas e não seguras por suas equivalentes mais recentes e seguras. Para obter mais informações, consulte Sobrecargas de modelo seguras.

Requisitos

Rotina Cabeçalho necessário
_mktemp_s <io.h>
_wmktemp_s <io.h> ou <wchar.h>

Para obter informações sobre compatibilidade, consulte Compatibilidade.

Exemplo

// 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;
}

Saída de exemplo

Unique filename is fna03188
Unique filename is fnb03188
Unique filename is fnc03188
Unique filename is fnd03188
Unique filename is fne03188

Confira também

Manipulação de arquivos
fopen, _wfopen
_getmbcp
_getpid
_open, _wopen
_setmbcp
_tempnam, _wtempnam, tmpnam, _wtmpnam
tmpfile_s