_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á odir
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
forNULL
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 edir
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.