_mktemp_s, _wmktemp_s

Erstellt einen eindeutigen Dateinamen. Diese Funktionen sind Versionen von _mktemp, _wmktemp mit Sicherheitsverbesserungen, wie in sicherheitsfeatures im CRT beschrieben.

Syntax

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

Parameter

nameTemplate
Muster des Dateinamens.

sizeInChars
Größe des Puffers in _mktemp_s in Einzelbytezeichen; Breitzeichen in _wmktemp_s, einschließlich NULL-Terminator.

Rückgabewert

Beide Funktionen geben bei Erfolg null und bei Fehlern einen Fehlercode zurück.

Fehlerbedingungen

nameTemplate sizeInChars Rückgabewert Neuer Wert in nameTemplate
NULL Beliebig EINVAL NULL
Falsches Format (siehe Abschnitt "Hinweise" für das richtige Format) Beliebig EINVAL Leere Zeichenfolge
Beliebig <= Anzahl der X-Zeichen EINVAL Leere Zeichenfolge

Wenn eine der oben genannten Fehlerbedingungen auftritt, wird der ungültige Parameterhandler aufgerufen, wie in der Parameterüberprüfung beschrieben. Wird die weitere Ausführung zugelassen, wird errno auf EINVAL gesetzt, und die Funktionen geben EINVAL zurück.

Hinweise

Die Funktion _mktemp_s vergibt einen eindeutigen Dateinamen, indem sie das Argument nameTemplate ändert. Auf diese Weise verweist der Zeiger für nameTemplate nach dem Aufruf auf eine Zeichenfolge mit dem neuen Dateinamen. _mktemp_s behandelt Multibyte-Zeichenfolgenargumente automatisch richtig. Die Erkennung von Multibyte-Zeichenfolgen erfolgt auf Grundlage der vom Laufzeitsystem zum jeweiligen Zeitpunkt verwendeten Multibyte-Codeseite. Bei _wmktemp_s handelt es sich um eine Breitzeichenversion von _mktemp_s. Das Argument von _wmktemp_s ist eine Breitzeichenfolge. _wmktemp_s und _mktemp_s verhalten sich identisch, mit der Ausnahme, dass _wmktemp_s multibyte-Zeichenfolgen nicht behandelt werden.

Die Debugbibliotheksversionen dieser Funktionen füllen zuerst den Puffer mit 0xFE. Verwenden Sie _CrtSetDebugFillThresholdzum Deaktivieren dieses Verhaltens .

Standardmäßig gilt der globale Zustand dieser Funktion für die Anwendung. Informationen zum Ändern dieses Verhaltens finden Sie im Global state in the CRT.

Generische Textroutinzuordnungen

Tchar.h-Routine _UNICODE und _MBCS nicht definiert _MBCS Definiert _UNICODE Definiert
_tmktemp_s _mktemp_s _mktemp_s _wmktemp_s

Das Argument nameTemplate hat das Format baseXXXXXX, wobei es sich bei base um den von Ihnen angegebenen Teil des neuen Dateinamens und bei den einzelnen X um Platzhalter für ein von _mktemp_s bereitgestelltes Zeichen handelt. Die einzelnen Platzhalterzeichen in nameTemplate müssen als X in Großschreibung angegeben sein. _mktemp_s behält base bei und ersetzt das erste nachgestellte X mit einem alphabetischen Zeichen. _mktemp_s Ersetzt die folgenden X-Zeichen durch einen fünfstelligen Wert. Dieser Wert ist eine eindeutige Zahl, die den aufrufenden Prozess oder in Multithread-Programmen identifiziert, den aufrufenden Thread.

Bei jedem erfolgreichen Aufruf von _mktemp_s wird nameTemplate geändert. Bei jedem darauffolgenden Aufruf aus demselben Prozess oder Thread mit demselben Argument nameTemplate sucht _mktemp_s nach Dateinamen, die den von _mktemp_s im Rahmen vorheriger Aufrufe zurückgegebenen Namen entsprechen. Wenn für einen bestimmten Namen keine Datei vorhanden ist, gibt _mktemp_s diesen Namen zurück. Wenn für alle zuvor zurückgegebenen Namen Dateien vorhanden sind, erstellt _mktemp_s einen neuen Namen, indem das im zuvor zurückgegebenen Namen enthaltene alphabetische Zeichen durch den nächsten verfügbaren Kleinbuchstaben (in absteigender Reihenfolge von „a“ bis „z“) ersetzt wird. Ist base beispielsweise

fn

und der von _mktemp_s bereitgestellte fünfstellige Wert 12345, lautet der erste zurückgegebene Name:

fna12345

Wenn dieser Name verwendet wird, um die Datei FNA12345 zu erstellen, und diese Datei noch vorhanden ist, lautet der nächste bei einem Aufruf aus demselben Prozess oder Thread mit demselben base für nameTemplate zurückgegebene Name:

fnb12345

Wenn FNA12345 nicht vorhanden ist, wird der nächste zurückgegebene Name erneut angezeigt:

fna12345

_mktemp_s kann maximal 26 eindeutige Dateinamen für eine beliebige Kombination von base und nameTemplate Werten erstellen. Daher ist FNZ12345 der letzte eindeutige Dateiname, den _mktemp_s für die in diesem Beispiel verwendeten Werte für base und nameTemplate vergeben kann.

In C++ wird die Verwendung dieser Funktionen durch Vorlagenüberladungen vereinfacht; die Überladungen können automatisch Rückschlüsse auf die Pufferlänge ziehen (wodurch kein Größenargument mehr angegeben werden muss), und sie können automatisch die älteren, nicht sicheren Funktionen durch ihre neueren, sicheren Entsprechungen ersetzen. Weitere Informationen finden Sie unter "Sichere Vorlagenüberladungen".

Anforderungen

Routine Erforderlicher Header
_mktemp_s <io.h>
_wmktemp_s <io.h> oder <wchar.h>

Weitere Informationen zur Kompatibilität finden Sie unter Kompatibilität.

Beispiel

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

Beispielausgabe

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

Siehe auch

Dateiverarbeitung
fopen, _wfopen
_getmbcp
_getpid
_open, _wopen
_setmbcp
_tempnam, _wtempnam, tmpnam, _wtmpnam
tmpfile_s