Compartilhar via


_mktemp, _wmktemp

Cria um nome de arquivo exclusivo. Versões mais seguras dessas funções estão disponíveis; confira _mktemp_s, _wmktemp_s.

Sintaxe

char *_mktemp(
   char *nameTemplate
);
wchar_t *_wmktemp(
   wchar_t *nameTemplate
);
template <size_t size>
char *_mktemp(
   char (&nameTemplate)[size]
); // C++ only
template <size_t size>
wchar_t *_wmktemp(
   wchar_t (&nameTemplate)[size]
); // C++ only

Parâmetros

nameTemplate
Padrão de nome de arquivo.

Valor retornado

Cada uma dessas funções retorna um ponteiro para o nameTemplate modificado. A função retorna NULL se nameTemplate estiver mal formada ou se não for possível criar mais nomes exclusivos a partir do nameTemplate fornecido.

Comentários

A função _mktemp cria um nome de arquivo exclusivo modificando o argumento nameTemplate. _mktemp 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 é uma versão de caractere largo de _mktemp; o argumento e o valor retornado de _wmktemp são cadeias de caracteres largos. _wmktemp e _mktemp se comportar de forma idêntica de outra forma, exceto que _wmktemp não lida com cadeias de caracteres multibyte.

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 _mktemp _mktemp _wmktemp

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. Cada caractere de espaço reservado em nameTemplate deve ser um X maiúsculo. _mktemp preserva base e substitui o primeiro X à direita por um caractere alfabético. _mktemp substitui os caracteres X à direita 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 modifica nameTemplate. Em cada chamada subsequente do mesmo processo ou thread com o mesmo argumento nameTemplate, _mktemp verifica os nomes de arquivos que correspondem aos nomes retornados por _mktemp em chamadas anteriores. Se não existir nenhum arquivo para um determinado nome, _mktemp retornará esse nome. Se existirem arquivos para todos os nomes retornados anteriormente, o _mktemp 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 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 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 pode criar para os valores base e nameTemplate usados neste exemplo.

Em caso de falha, errno é definido. Se nameTemplate tiver um formato inválido (por exemplo, menos de seis caracteres X), errno é definido como EINVAL. Se _mktemp não for possível criar um nome exclusivo porque todos os 26 nomes de arquivo possíveis já existem, _mktemp define nameTemplate como uma string vazia e retorna EEXIST.

No C++, essas funções têm sobrecargas de modelo que invocam os equivalentes mais novos e seguros dessas funções. Para obter mais informações, consulte Sobrecargas de modelo seguras.

Requisitos

Rotina Cabeçalho necessário
_mktemp <io.h>
_wmktemp <io.h> ou <wchar.h>

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

Exemplo

// crt_mktemp.c
// compile with: /W3
/* The program uses _mktemp to create
* unique filenames. It opens each filename
* to ensure that the next name is unique.
*/

#include <io.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>

char *template = "fnXXXXXX";
char *result;
char names[27][9];

int main( void )
{
   int i;
   FILE *fp;

   for( i = 0; i < 27; i++ )
   {
      strcpy_s( names[i], sizeof( names[i] ), template );
      /* Attempt to find a unique filename: */
      result = _mktemp( names[i] );  // C4996
      // Note: _mktemp is deprecated; consider using _mktemp_s instead
      if( result == NULL )
      {
         printf( "Problem creating the template\n" );
         if (errno == EINVAL)
         {
             printf( "Bad parameter\n");
         }
         else if (errno == EEXIST)
         {
             printf( "Out of unique filenames\n");
         }
      }
      else
      {
         fopen_s( &fp, result, "w" );
         if( fp != NULL )
            printf( "Unique filename is %s\n", result );
         else
            printf( "Cannot open %s\n", result );
         fclose( fp );
      }
   }
}
Unique filename is fna03912
Unique filename is fnb03912
Unique filename is fnc03912
Unique filename is fnd03912
Unique filename is fne03912
Unique filename is fnf03912
Unique filename is fng03912
Unique filename is fnh03912
Unique filename is fni03912
Unique filename is fnj03912
Unique filename is fnk03912
Unique filename is fnl03912
Unique filename is fnm03912
Unique filename is fnn03912
Unique filename is fno03912
Unique filename is fnp03912
Unique filename is fnq03912
Unique filename is fnr03912
Unique filename is fns03912
Unique filename is fnt03912
Unique filename is fnu03912
Unique filename is fnv03912
Unique filename is fnw03912
Unique filename is fnx03912
Unique filename is fny03912
Unique filename is fnz03912
Problem creating the template.
Out of unique filenames.

Confira também

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