Partager via


_tempnam, _wtempnam, tmpnam, _wtmpnam

Génèrent des noms que vous pouvez utiliser pour créer des fichiers temporaires. Des versions plus sécurisées de certaines de ces fonctions sont disponibles ; voir tmpnam_s, _wtmpnam_s.

Syntaxe

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

Paramètres

prefix
Chaîne qui est ajoutée aux noms retournés par _tempnam.

dir
Chemin d’accès utilisé dans le nom de fichier s’il n’existe aucune variable d’environnement TMP ou si TMP n’est pas un répertoire valide.

str
Pointeur qui contient le nom généré, identique au nom retourné par la fonction. Il s’agit d’un moyen pratique d’enregistrer le nom généré.

Valeur retournée

Chacune de ces fonctions retourne un pointeur vers le nom généré ou NULL en cas de défaillance. L’échec peut se produire si vous tentez plus que TMP_MAX (voir STDIO. H) appelle ou tmpnam si vous utilisez _tempnam et qu’il existe un nom de répertoire non valide spécifié dans la TMP variable d’environnement et dans le dir paramètre.

Remarque

Les pointeurs retournés par tmpnam et _wtmpnam pointent vers des mémoires tampons internes statiques. free ne doit pas être appelé pour libérer ces pointeurs. free doit être appelé pour les pointeurs alloués par _tempnam et _wtempnam.

Notes

Chacune de ces fonctions retourne le nom d’un fichier qui n’existe pas actuellement. tmpnam retourne un nom unique dans le répertoire temporaire Windows désigné retourné par GetTempPathW. _tempnam génère un nom unique dans un répertoire autre que celui désigné. Lorsqu’un nom de fichier est précédé d’une barre oblique inverse et qu’aucune information de chemin d’accès, par \fname21exemple, indique que le nom est valide pour le répertoire de travail actif.

Pour tmpnam, vous pouvez stocker ce nom de fichier généré dans str. Si str a la valeur NULL, tmpnam maintient le résultat dans une mémoire tampon statique interne. Par conséquent, tous les appels suivants détruisent cette valeur. Le nom généré par tmpnam se compose d’un nom de fichier généré par le programme et, après le premier appel à tmpnam, d’une extension de fichier constituée de numéros séquentiels en base 32 (.1-.vvu, quand TMP_MAX dans STDIO.H a la valeur 32 767).

_tempnam génère un nom de fichier unique pour un répertoire choisi par les règles suivantes :

  • Si la variable d’environnement TMP est définie et définie sur un nom de répertoire valide, les noms de fichiers uniques sont générés pour le répertoire spécifié par TMP.

  • Si la variable d’environnement TMP n’est pas définie ou si elle est définie sur le nom d’un répertoire qui n’existe pas, _tempnam utilise le dir paramètre comme chemin d’accès pour lequel il génère des noms uniques.

  • Si la variable d’environnement TMP n’est pas définie ou si elle est définie sur le nom d’un répertoire qui n’existe pas, et si dir elle est NULL ou définie sur le nom d’un répertoire qui n’existe pas, _tempnam utilise le répertoire de travail actuel pour générer des noms uniques. Actuellement, si TMP et dir spécifiez les noms des répertoires qui n’existent pas, l’appel de fonction _tempnam échoue.

Le nom retourné par _tempnam est une concaténation de nombres séquentiels, qui combinent pour créer un nom de prefix fichier unique pour le répertoire spécifié. _tempnam génère des noms de fichiers sans extension. _tempnam utilise malloc pour allouer de l’espace pour le nom de fichier ; le programme est chargé de libérer cet espace lorsqu’il n’est plus nécessaire.

_tempnam et tmpnam gèrent automatiquement les arguments de chaîne de caractères multioctets comme il convient, en identifiant les séquences de caractères multioctets en fonction de la page de codes OEM obtenue du système d’exploitation. _wtempnam est une version à caractères larges de _tempnam ; les arguments et la valeur de retour de _wtempnam sont des chaînes de caractères larges. _wtempnam et _tempnam se comportent de la même façon, sauf que _wtempnam cela ne gère pas les chaînes de caractères multioctets. _wtmpnam est une version à caractères larges de tmpnam ; l'argument et la valeur de retour de _wtmpnam sont des chaînes à caractères larges. _wtmpnam et tmpnam se comportent de la même façon, sauf que _wtmpnam cela ne gère pas les chaînes de caractères multioctets.

Si _DEBUG et _CRTDBG_MAP_ALLOC sont définis, _tempnam et _wtempnam sont remplacés par des appels à _tempnam_dbg et _wtempnam_dbg.

Mappages de routine de texte générique

Routine TCHAR.H _UNICODE et _MBCS non défini _MBCS Défini _UNICODE Défini
_ttmpnam tmpnam tmpnam _wtmpnam
_ttempnam _tempnam _tempnam _wtempnam

Spécifications

Routine En-tête requis
_tempnam <stdio.h>
_wtempnam, _wtmpnam <stdio.h> ou <wchar.h>
tmpnam <stdio.h>

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

Exemple

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

Voir aussi

E/S de flux
_getmbcp
malloc
_setmbcp
tmpfile
tmpfile_s