Compartilhar via


_tempnam, _wtempnam, tmpnam, _wtmpnam

Gere nomes que podem ser usados para criar arquivos temporários. Versões mais seguras de algumas dessas funções estão disponíveis; veja tmpnam_s, _wtmpnam_s.

Sintaxe

char *_tempnam(
   const char *dir,
   const char *prefix
);
wchar_t *_wtempnam(
   const wchar_t *dir,
   const wchar_t *prefix
);
char *tmpnam(
   char *str
);
wchar_t *_wtmpnam(
   wchar_t *str
);

Parâmetros

prefix
A cadeia de caracteres anexada aos nomes retornados por _tempnam.

dir
O caminho usado no nome do arquivo se não houver nenhuma variável de ambiente TMP ou se TMP não for um diretório válido.

str
Ponteiro que contém o nome gerado, idêntico ao nome retornado pela função. É uma maneira conveniente de salvar o nome gerado.

Valor retornado

Cada uma dessas funções retorna um ponteiro para o nome gerado ou NULL se houver uma falha. A falha pode ocorrer se você tentar mais de TMP_MAX (consulte STDIO. H) chamadas com tmpnam ou se você usar _tempnam e houver um nome de diretório inválido especificado na TMP variável de ambiente e no dir parâmetro.

Observação

Os ponteiros retornados por tmpnam e _wtmpnam apontam para buffers estáticos internos. free não deve ser chamado para desalocar esses ponteiros. free precisa ser chamado para ponteiros alocados por _tempnam e _wtempnam.

Comentários

Cada uma dessas funções retorna o nome de um arquivo que não existe no momento. tmpnam retorna um nome exclusivo no diretório temporário do Windows designado retornado por GetTempPathW. _tempnam gera um nome exclusivo em um diretório diferente do designado. Quando um nome de arquivo é anexado com uma barra invertida e nenhuma informação de caminho, como \fname21, isso indica que o nome é válido para o diretório de trabalho atual.

Para tmpnam, é possível armazenar esse nome de arquivo gerado em str. Se str for NULL, tmpnam deixará o resultado em um buffer estático interno. Portanto, todas as chamadas posteriores destroem esse valor. O nome gerado por tmpnam consiste em um nome de arquivo gerado pelo programa e, após a primeira chamada a tmpnam, uma extensão de arquivo de números sequenciais em base 32 (.1-.vvu quando TMP_MAX em STDIO.H é 32.767).

_tempnam Gera um nome de arquivo exclusivo para um diretório escolhido pelas seguintes regras:

  • Se a variável de ambiente TMP for definida e configurada como um nome de diretório válido, nomes de arquivo exclusivos serão gerados para o diretório especificado pelo TMP.

  • Se a variável de ambiente TMP não estiver definida ou se estiver definida como o nome de um diretório que não existe, _tempnam usará o dir parâmetro como o caminho para o qual ele gera nomes exclusivos.

  • Se a variável de ambiente TMP não estiver definida ou se estiver definida como o nome de um diretório que não existe, e se dir for NULL ou definida como o nome de um diretório que não existe, _tempnam usará o diretório de trabalho atual para gerar nomes exclusivos. Atualmente, se TMP e dir especificarem nomes de diretórios que não existem, a chamada de função _tempnam falhará.

O nome retornado por _tempnam é uma concatenação e prefix um número sequencial, que se combinam para criar um nome de arquivo exclusivo para o diretório especificado. _tempnam gera nomes de arquivo que não tem nenhuma extensão. _tempnam usa malloc para alocar espaço para o nome do arquivo; o programa é responsável por liberar esse espaço quando ele não é mais necessário.

_tempnam e tmpnam manipulam automaticamente argumentos da cadeia de caracteres multibyte conforme apropriado, reconhecendo as sequências de caracteres multibyte de acordo com a página de código do OEM obtida do sistema operacional. _wtempnam é uma versão de caractere largo de _tempnam; os argumentos e o valor retornado de _wtempnam são cadeias de caracteres largos. _wtempnam e _tempnam têm comportamento idêntico, exceto pelo fato de que _wtempnam não manipula cadeias de caracteres multibyte. _wtmpnam é uma versão de caractere largo de tmpnam; o argumento e o valor retornado de _wtmpnam são cadeias de caracteres largos. _wtmpnam e tmpnam têm comportamento idêntico, exceto pelo fato de que _wtmpnam não manipula cadeias de caracteres multibyte.

If _DEBUG e _CRTDBG_MAP_ALLOC são definidos _tempnam e _wtempnam são substituídos por chamadas para _tempnam_dbg e _wtempnam_dbg.

Mapeamentos de rotina de texto genérico

Rotina TCHAR.H _UNICODE e _MBCS não definidos _MBCS definido _UNICODE definido
_ttmpnam tmpnam tmpnam _wtmpnam
_ttempnam _tempnam _tempnam _wtempnam

Requisitos

Rotina Cabeçalho necessário
_tempnam <stdio.h>
_wtempnam, _wtmpnam <stdio.h> ou <wchar.h>
tmpnam <stdio.h>

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

Exemplo

// crt_tempnam.c
// compile with: /W3
// This program uses tmpnam to create a unique filename in the
// temporary directory, and _tempname to create a unique filename
// in C:\\tmp.

#include <stdio.h>
#include <stdlib.h>

int main(void)
{
   char * name1 = NULL;
   char * name2 = NULL;
   char * name3 = NULL;

   // Create a temporary filename for the current working directory:
   if ((name1 = tmpnam(NULL)) != NULL) { // C4996
   // Note: tmpnam is deprecated; consider using tmpnam_s instead
      printf("%s is safe to use as a temporary file.\n", name1);
   } else {
      printf("Cannot create a unique filename\n");
   }

   // Create a temporary filename in temporary directory with the
   // prefix "stq". The actual destination directory may vary
   // depending on the state of the TMP environment variable and
   // the global variable P_tmpdir.

   if ((name2 = _tempnam("c:\\tmp", "stq")) != NULL) {
      printf("%s is safe to use as a temporary file.\n", name2);
   } else {
      printf("Cannot create a unique filename\n");
   }

   // When name2 is no longer needed:
   if (name2) {
      free(name2);
   }

   // Unset TMP environment variable, then create a temporary filename in C:\tmp.
   if (_putenv("TMP=") != 0) {
      printf("Could not remove TMP environment variable.\n");
   }

   // With TMP unset, we'll use C:\tmp as the temporary directory.
   // Create a temporary filename in C:\tmp with prefix "stq".
   if ((name3 = _tempnam("c:\\tmp", "stq")) != NULL) {
      printf("%s is safe to use as a temporary file.\n", name3);
   }
   else {
      printf("Cannot create a unique filename\n");
   }

   // When name3 is no longer needed:
   if (name3) {
      free(name3);
   }

   return 0;
}
C:\Users\LocalUser\AppData\Local\Temp\sriw.0 is safe to use as a temporary file.
C:\Users\LocalUser\AppData\Local\Temp\stq2 is safe to use as a temporary file.
c:\tmp\stq3 is safe to use as a temporary file.

Confira também

E/S de fluxo
_getmbcp
malloc
_setmbcp
tmpfile
tmpfile_s