_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 \fname21
exemple, 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 ledir
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 estNULL
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 etdir
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 routines de texte générique
Routine TCHAR.H | _UNICODE et _MBCS non définis |
_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.