_tempnam, _wtempnam, tmpnam, _wtmpnam

Genere nombres que se puedan usar para crear archivos temporales. Hay disponibles versiones más seguras de algunas de estas funciones; vea tmpnam_s, _wtmpnam_s.

Sintaxis

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
Cadena anteponeda a los nombres devueltos por _tempnam.

dir
Ruta de acceso usada en el nombre de archivo si no hay ninguna variable de entorno TMP o si TMP no es un directorio válido.

str
Puntero que contiene el nombre generado, idéntico al nombre devuelto por la función. Es una manera cómoda de guardar el nombre generado.

Valor devuelto

Cada una de estas funciones devuelve un puntero al nombre generado o NULL si se produce un error. Se puede producir un error si intenta más de TMP_MAX (consulte STDIO. H) llama a con tmpnam o si usa _tempnam y hay un nombre de directorio no válido especificado en la TMP variable de entorno y en el dir parámetro .

Nota:

Los punteros devueltos por tmpnam y _wtmpnam apuntan a búferes estáticos internos. free no se debe llamar a para desasignar esos punteros. Es necesario llamar a free en el caso de los punteros asignados por _tempnam y _wtempnam.

Comentarios

Cada una de estas funciones devuelve el nombre de un archivo que no existe actualmente. tmpnam devuelve un nombre único en el directorio temporal designado de Windows devuelto por GetTempPathW. _tempnam genera un nombre único en un directorio distinto del designado. Cuando se antepone un nombre de archivo con una barra diagonal inversa y no hay información de ruta de acceso, como \fname21, indica que el nombre es válido para el directorio de trabajo actual.

En el caso de tmpnam, puede almacenar este nombre de archivo generado en str. Si str es NULL, tmpnam deja el resultado en un búfer estático interno. Por lo tanto, las siguientes llamadas destruyen este valor. El nombre generado por tmpnam consta de un nombre de archivo generado por el programa y, tras la primera llamada a tmpnam, de una extensión de archivo de números secuenciales en base 32 (.1-.vvu cuando TMP_MAX en STDIO.H es 32.767).

_tempnam genera un nombre de archivo único para un directorio elegido por las reglas siguientes:

  • Si se define la variable de entorno TMP y se establece en un nombre de directorio válido, se generan nombres de archivo únicos para el directorio especificado por TMP.

  • Si la variable de entorno TMP no está definida o si se establece en el nombre de un directorio que no existe, _tempnam usa el dir parámetro como la ruta de acceso para la que genera nombres únicos.

  • Si la variable de entorno TMP no está definida o si está establecida en el nombre de un directorio que no existe, y si dir es o NULL se establece en el nombre de un directorio que no existe, _tempnam usa el directorio de trabajo actual para generar nombres únicos. Actualmente, si TMP y dir especifican nombres de directorios que no existen, se produce un error en la llamada de función de _tempnam .

El nombre devuelto por _tempnam es una concatenación de prefix y un número secuencial, que se combinan para crear un nombre de archivo único para el directorio especificado. _tempnam genera nombres de archivo sin extensión. _tempnam usa malloc para asignar espacio para el nombre de archivo; el programa es responsable de liberar este espacio cuando ya no es necesario.

_tempnam y tmpnam controlan automáticamente argumentos de cadena de caracteres multibyte como sea necesario, reconociendo las secuencias de caracteres multibyte en función de la página de códigos OEM obtenida del sistema operativo. _wtempnam es una versión con caracteres anchos de _tempnam; los argumentos y el valor devuelto de _wtempnam son cadenas de caracteres anchos. _wtempnam y _tempnam se comportan de manera idéntica, salvo que _wtempnam no controla las cadenas de caracteres multibyte. _wtmpnam es una versión con caracteres anchos de tmpnam; el argumento y el valor devuelto de _wtmpnam son cadenas de caracteres anchos. _wtmpnam y tmpnam se comportan de manera idéntica, salvo que _wtmpnam no controla las cadenas de caracteres multibyte.

Si _DEBUG y _CRTDBG_MAP_ALLOC se definen, _tempnam y _wtempnam se reemplazan por llamadas a _tempnam_dbg y _wtempnam_dbg.

Asignaciones de rutinas de texto genérico

Rutina TCHAR.H _UNICODE y _MBCS no definidos _MBCS definido _UNICODE definido
_ttmpnam tmpnam tmpnam _wtmpnam
_ttempnam _tempnam _tempnam _wtempnam

Requisitos

Routine Encabezado necesario
_tempnam <stdio.h>
_wtempnam, _wtmpnam <stdio.h> o <wchar.h>
tmpnam <stdio.h>

Para obtener más información sobre compatibilidad, consulte Compatibilidad.

Ejemplo

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

Consulte también

E/S de secuencia
_getmbcp
malloc
_setmbcp
tmpfile
tmpfile_s