_mktemp_s, _wmktemp_s

Crea un nombre de archivo único. Estas funciones son versiones de _mktemp, _wmktemp con mejoras de seguridad como se describe en Características de seguridad de CRT.

Sintaxis

errno_t _mktemp_s(
   char *nameTemplate,
   size_t sizeInChars
);
errno_t _wmktemp_s(
   wchar_t *nameTemplate,
   size_t sizeInChars
);
template <size_t size>
errno_t _mktemp_s(
   char (&nameTemplate)[size]
); // C++ only
template <size_t size>
errno_t _wmktemp_s(
   wchar_t (&nameTemplate)[size]
); // C++ only

Parámetros

nameTemplate
Patrón de nombre de archivo.

sizeInChars
Tamaño del búfer en caracteres de byte único en _mktemp_s; caracteres anchos en _wmktemp_s, incluido el terminador nulo.

Valor devuelto

Ambas funciones devuelven cero si se realizan correctamente o un código de error en caso de error.

Condiciones de error

nameTemplate sizeInChars Valor devuelto Nuevo valor en nameTemplate
NULL cualquiera EINVAL NULL
Formato incorrecto (consulte la sección Comentarios para ver el formato correcto) cualquiera EINVAL cadena vacía
cualquiera <= número de caracteres X EINVAL cadena vacía

Si se produce alguna de las condiciones de error anteriores, se invoca al controlador de parámetros no válidos, como se describe en Validación de parámetros. Si la ejecución puede continuar, errno se establece en EINVAL y la función devuelve EINVAL.

Comentarios

La función _mktemp_s crea un nombre de archivo único modificando el argumento nameTemplate. Así, después de la llamada, el puntero nameTemplate apunta a una cadena que contiene el nuevo nombre de archivo. _mktemp_s controla automáticamente los argumentos de cadenas de caracteres multibyte según corresponda, reconociendo las secuencias de caracteres multibyte según la página de códigos multibyte que usa actualmente el sistema en tiempo de ejecución. _wmktemp_s es una versión con caracteres anchos de _mktemp_s; el argumento de _wmktemp_s es una cadena de caracteres anchos. _wmktemp_s y _mktemp_s se comportan de forma idéntica, salvo que _wmktemp_s no controla las cadenas de caracteres multibyte.

Las versiones de la biblioteca de depuración de estas funciones rellenan primero el búfer con 0xFE. Para deshabilitar este comportamiento, use _CrtSetDebugFillThreshold.

De manera predeterminada, el estado global de esta función está limitado a la aplicación. Para cambiar este comportamiento, consulte Estado global en CRT.

Asignaciones de rutinas de texto genérico

Rutina Tchar.h _UNICODE y _MBCS no definidos _MBCS definido _UNICODE definido
_tmktemp_s _mktemp_s _mktemp_s _wmktemp_s

El argumento nameTemplate tiene el formato baseXXXXXX, donde base es la parte del nuevo nombre de archivo proporcionado y cada X es un marcador de posición de un carácter proporcionado por _mktemp_s. Cada marcador de posición de nameTemplate debe ser una X mayúscula. _mktemp_s conserva base y reemplaza la primera X final por un carácter alfabético. _mktemp_s reemplaza los caracteres X que siguen por un valor de cinco dígitos. Este valor es un número único que identifica el proceso de llamada o en programas multiproceso, el subproceso que realiza la llamada.

Cada llamada correcta a _mktemp_s modifica nameTemplate. En cada llamada posterior realizada desde el mismo proceso o subproceso con el mismo argumento nameTemplate, _mktemp_s busca nombres de archivo que coincidan con los nombres devueltos por _mktemp_s en las llamadas anteriores. Si no existe ningún archivo para un nombre concreto, _mktemp_s devuelve dicho nombre. Si existen archivos de todos los nombres devueltos previamente, _mktemp_s crea un nombre nuevo sustituyendo el carácter alfabético que emplea en el nombre devuelto anteriormente por la siguiente letra minúscula disponible (en orden, de la «a» a la «z»). Por ejemplo, si base es:

fn

y el valor de cinco dígitos proporcionado por _mktemp_s es 12345, el primer nombre devuelto es:

fna12345

Si este nombre se usa para crear el archivo FNA12345 y el archivo todavía existe, el siguiente nombre devuelto en una llamada desde el mismo proceso o subproceso con el mismo base para nameTemplate es:

fnb12345

Si no existe FNA12345, el nombre siguiente devuelto es de nuevo:

fna12345

_mktemp_s puede crear un máximo de 26 nombres de archivo únicos para cualquier combinación determinada de base valores y nameTemplate . Por lo tanto, FNZ12345 es el último nombre de archivo único que _mktemp_s puede crear para los valores base y nameTemplate usados en este ejemplo.

En C++, el uso de estas funciones se simplifica con las sobrecargas de plantilla; las sobrecargas pueden realizar una inferencia automáticamente de la longitud de búfer (lo que elimina el requisito de especificar un argumento de tamaño) y pueden reemplazar automáticamente funciones anteriores no seguras con sus homólogos seguros más recientes. Para obtener más información, consulte Sobrecargas de plantillas seguras.

Requisitos

Routine Encabezado necesario
_mktemp_s <io.h>
_wmktemp_s <io.h> o <wchar.h>

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

Ejemplo

// crt_mktemp_s.cpp
/* The program uses _mktemp to create
* five unique filenames. It opens each filename
* to ensure that the next name is unique.
*/

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

char *fnTemplate = "fnXXXXXX";
char names[5][9];

int main()
{
   int i, err, sizeInChars;
   FILE *fp;

   for( i = 0; i < 5; i++ )
   {
      strcpy_s( names[i], sizeof(names[i]), fnTemplate );
      /* Get the size of the string and add one for the null terminator.*/
      sizeInChars = strnlen(names[i], 9) + 1;
      /* Attempt to find a unique filename: */
      err = _mktemp_s( names[i], sizeInChars );
      if( err != 0 )
         printf( "Problem creating the template" );
      else
      {
         if( fopen_s( &fp, names[i], "w" ) == 0 )
            printf( "Unique filename is %s\n", names[i] );
         else
            printf( "Cannot open %s\n", names[i] );
         fclose( fp );
      }
   }

   return 0;
}

Salida de ejemplo

Unique filename is fna03188
Unique filename is fnb03188
Unique filename is fnc03188
Unique filename is fnd03188
Unique filename is fne03188

Consulte también

Control de archivos
fopen, _wfopen
_getmbcp
_getpid
_open, _wopen
_setmbcp
_tempnam, _wtempnam, tmpnam, _wtmpnam
tmpfile_s