Condividi tramite


_tempnam, _wtempnam, tmpnam_wtmpnam

Genera i nomi che è possibile usare per creare file temporanei. Sono disponibili versioni più sicure di alcune di queste funzioni; vedere tmpnam_s, _wtmpnam_s.

Sintassi

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
);

Parametri

prefix
Stringa anteporta ai nomi restituiti da _tempnam.

dir
Percorso usato nel nome del file se non è presente alcuna variabile di ambiente TMP o se TMP non è una directory valida.

str
Puntatore che contiene il nome generato, identico al nome restituito dalla funzione. È un modo pratico per salvare il nome generato.

Valore restituito

Ognuna di queste funzioni restituisce un puntatore al nome generato o NULL in caso di errore. L'errore può verificarsi se si tenta più di TMP_MAX (vedere STDIO. H) chiama con tmpnam o se si usa _tempnam e esiste un nome di directory non valido specificato nella TMP variabile di ambiente e nel dir parametro .

Nota

I puntatori restituiti da tmpnam e _wtmpnam puntano a buffer statici interni. free non deve essere chiamato per deallocare tali puntatori. È necessario chiamare free per i puntatori allocati da _tempnam e _wtempnam.

Osservazioni:

Ognuna di queste funzioni restituisce il nome di un file che non esiste attualmente. tmpnam restituisce un nome univoco nella directory temporanea di Windows designata restituita da GetTempPathW. _tempnam genera un nome univoco in una directory diversa da quella designata. Quando un nome file viene anteporto a una barra rovesciata e nessuna informazione sul percorso, ad esempio \fname21, indica che il nome è valido per la directory di lavoro corrente.

Per tmpnam, è possibile archiviare questo nome del file generato in str. Se str è NULL, tmpnam lascia il risultato in un buffer interno statico. Le eventuali chiamate successive eliminano quindi questo valore. Il nome generato da tmpnam è costituito da un nome di file generato dal programma e, dopo la prima chiamata a tmpnam, un'estensione di file composta da numeri sequenziali in base 32 (.1-.vvu, quando TMP_MAX in STDIO.H è 32.767).

_tempnam genera un nome di file univoco per una directory scelta dalle regole seguenti:

  • Se la variabile di ambiente TMP è definita e impostata su un nome di directory valido, i nomi di file univoci vengono generati per la directory specificata da TMP.

  • Se la variabile di ambiente TMP non è definita o se è impostata sul nome di una directory che non esiste, _tempnam usa il dir parametro come percorso per il quale genera nomi univoci.

  • Se la variabile di ambiente TMP non è definita o se è impostata sul nome di una directory che non esiste e se dir è NULL o è impostata sul nome di una directory che non esiste, _tempnam usa la directory di lavoro corrente per generare nomi univoci. Attualmente, se sia TMP che dir specificano nomi di directory che non esistono, la chiamata di funzione _tempnam ha esito negativo.

Il nome restituito da _tempnam è una concatenazione di prefix e un numero sequenziale, che combina per creare un nome di file univoco per la directory specificata. _tempnam genera nomi di file senza estensione. _tempnam usa malloc per allocare spazio per il nome file; il programma è responsabile della liberazione di questo spazio quando non è più necessario.

_tempnam e tmpnam gestiscono automaticamente gli argomenti stringa di caratteri multibyte in modo appropriato, riconoscendo le sequenze di caratteri multibyte in base alla tabella codici OEM ottenuta dal sistema operativo. _wtempnam è una versione a caratteri wide di _tempnam. Gli argomenti e il valore restituito di _wtempnam sono stringhe di caratteri wide. _wtempnam e _tempnam si comportano in modo identico, ad eccezione del fatto che _wtempnam non gestisce stringhe di caratteri multibyte. _wtmpnam è una versione a caratteri wide di tmpnam. L'argomento e il valore restituito di _wtmpnam sono stringhe a caratteri wide. _wtmpnam e tmpnam si comportano in modo identico, ad eccezione del fatto che _wtmpnam non gestisce stringhe di caratteri multibyte.

Se _DEBUG e _CRTDBG_MAP_ALLOC sono definiti _tempnam e _wtempnam vengono sostituiti da chiamate a _tempnam_dbg e _wtempnam_dbg.

Mapping di routine di testo generico

Routine TCHAR.H _UNICODE e _MBCS non definito _MBCS definito _UNICODE definito
_ttmpnam tmpnam tmpnam _wtmpnam
_ttempnam _tempnam _tempnam _wtempnam

Requisiti

Ciclo Intestazione obbligatoria
_tempnam <stdio.h>
_wtempnam, _wtmpnam <stdio.h> o <wchar.h>
tmpnam <stdio.h>

Per altre informazioni sulla compatibilità, vedere Compatibility (Compatibilità).

Esempio

// 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.

Vedi anche

I/O di flusso
_getmbcp
malloc
_setmbcp
tmpfile
tmpfile_s