Partager via


_mktemp_s, _wmktemp_s

Crée un nom de fichier unique. Ces fonctions sont des versions de _mktemp, _wmktemp avec des améliorations de sécurité, comme indiqué dans Fonctionnalités de sécurité dans le CRT.

Syntaxe

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

Paramètres

nameTemplate
Modèle de nom de fichier.

sizeInChars
Taille de la mémoire tampon en caractères codés sur un octet (_mktemp_s) ou en caractères larges (_wmktemp_s), marque de fin Null comprise.

Valeur retournée

Ces deux fonctions retournent zéro en cas de réussite, sinon un code d’erreur.

Conditions d’erreur

nameTemplate sizeInChars Valeur retournée Nouvelle valeur dans nameTemplate
NULL n'importe laquelle EINVAL NULL
Format incorrect (voir la section Remarques pour un format correct) n'importe laquelle EINVAL chaîne vide
n'importe laquelle <= nombre de caractères X EINVAL chaîne vide

Si l’une des conditions d’erreur ci-dessus se produit, le gestionnaire de paramètres non valide est appelé, comme décrit dans la validation des paramètres. Si l’exécution est autorisée à se poursuivre, errno est défini sur EINVAL et la fonction retourne EINVAL.

Notes

La fonction _mktemp_s crée un nom de fichier unique en modifiant l’argument nameTemplate, afin qu’après l’appel, le pointeur nameTemplate désigne une chaîne qui contient le nouveau nom de fichier. _mktemp_s gère automatiquement les arguments de chaîne de caractères multioctets selon le cas, en identifiant les séquences de caractères multioctets en fonction de la page de codes multioctets en cours d'utilisation par le système d'exécution. _wmktemp_s est une version à caractères larges de _mktemp_s ; l’argument de _wmktemp_s est une chaîne à caractères larges. _wmktemp_s et _mktemp_s se comportent de la même manière, sauf que _wmktemp_s cela ne gère pas les chaînes de caractères multioctets.

Les versions de bibliothèque de débogage de ces fonctions remplissent d’abord la mémoire tampon avec 0xFE. Pour désactiver ce comportement, utilisez _CrtSetDebugFillThreshold.

Par défaut, l’état global de cette fonction est limité à l’application. Pour modifier ce comportement, consultez État global dans le CRT.

Mappages de routines de texte générique

Routine Tchar.h _UNICODE et _MBCS non définis _MBCS défini _UNICODE défini
_tmktemp_s _mktemp_s _mktemp_s _wmktemp_s

L’argument nameTemplate se présente sous la forme baseXXXXXX, où base est la partie du nouveau nom de fichier que vous spécifiez et chaque X est un espace réservé pour un caractère fourni par _mktemp_s. Chaque caractère d’espace réservé dans nameTemplate doit être un X majuscule. _mktemp_s conserve base et remplace le premier X de fin par un caractère alphabétique. _mktemp_s remplace les caractères X qui suivent par une valeur à cinq chiffres. Cette valeur est un numéro unique qui identifie le processus appelant, ou dans les programmes multithreads, le thread appelant.

Chaque appel réussi à _mktemp_s modifie nameTemplate. Dans chaque appel suivant du même processus ou thread avec le même argument nameTemplate, _mktemp_s recherche des noms de fichier qui correspondent aux noms retournés par _mktemp_s dans les appels précédents. Si aucun fichier n'existe pour le nom spécifié, _mktemp_s retourne ce nom. Si des fichiers existent pour tous les noms précédemment retournés, _mktemp_s crée un nom en remplaçant le caractère alphabétique utilisé dans le nom précédemment retourné par la lettre minuscule suivante disponible, dans l'ordre, de "a" à "z". Par exemple, si base est :

fn

et la valeur à cinq chiffres fournie par _mktemp_s est 12345, le premier nom retourné est :

fna12345

Si ce nom est utilisé pour créer le fichier FNA12345 et si ce fichier existe toujours, le nom suivant retourné sur un appel du même processus ou thread avec la même valeur base pour nameTemplate est :

fnb12345

Si FNA12345 n’existe pas, le nom suivant retourné est à nouveau :

fna12345

_mktemp_s peut créer un maximum de 26 noms de fichiers uniques pour n’importe quelle combinaison donnée de base fichiers et nameTemplate valeurs. Par conséquent, FNZ12345 est le dernier nom de fichier unique que _mktemp_s peut créer pour les valeurs base et nameTemplate utilisées dans cet exemple.

En C++, l’utilisation de ces fonctions est simplifiée par les surcharges de modèle ; les surcharges peuvent déduire la longueur de la mémoire tampon automatiquement (ce qui évite d’avoir à spécifier un argument taille) et peuvent remplacer automatiquement les fonctions plus anciennes et non sécurisées par leurs équivalentes plus récentes et sécurisées. Pour plus d'informations, consultez Sécuriser les surcharges de modèle.

Spécifications

Routine En-tête requis
_mktemp_s <io.h>
_wmktemp_s <io.h> ou <wchar.h>

Pour plus d’informations sur la compatibilité, consultez Compatibility.

Exemple

// 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;
}

Exemple de sortie

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

Voir aussi

Gestion des fichiers
fopen, _wfopen
_getmbcp
_getpid
_open, _wopen
_setmbcp
_tempnam, , _wtempnamtmpnam, ,_wtmpnam
tmpfile_s