_mktemp_s, _wmktemp_s

一意のファイル名を作成します。 これらの関数は、CRT_mktemp_wmktempセキュリティ機能の説明に従ってセキュリティが強化されたバージョンの関数です。

構文

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

パラメーター

nameTemplate
ファイル名のパターン。

sizeInChars
_wmktemp_s の場合は 1 バイト文字単位、_mktemp_s の場合はワイド文字単位のバッファー サイズ。null 終端文字を含みます。

戻り値

これらの関数のどちらも、成功した場合は 0 を返し、エラーの場合はエラー コードを返します。

エラー条件

nameTemplate sizeInChars 戻り値 の新しい値 nameTemplate
NULL any EINVAL NULL
正しくない形式 (正しい形式については「解説」セクションを参照) any EINVAL 空の文字列
any <= X 文字の数 EINVAL 空の文字列

上記のいずれかのエラー状態が発生した場合は、「パラメーターの検証」で説明されているように、無効なパラメーター ハンドラーが呼び出されます。 実行の継続が許可された場合、errnoEINVAL に設定され、関数から EINVAL が返されます。

解説

_mktemp_s 関数は nameTemplate 引数を変更して一意のファイル名を作成します。したがって、呼び出し後、nameTemplate ポインターは新しいファイル名を含む文字列を指します。 _mktemp_s は、ランタイム システムによって現在使用中のマルチバイト コード ページに従ってマルチバイト文字シーケンスを認識し、マルチバイト文字列の引数を適切な方法で自動的に処理します。 _wmktemp_s_mktemp_s のワイド文字バージョンです。_wmktemp_s の引数はワイド文字列です。 _wmktemp_s_mktemp_s 同じように動作しますが、マルチバイト文字列を処理しない点が異 _wmktemp_s なります。

これらの関数のデバッグ ライブラリ バージョンでは、最初にバッファーを 0xFE で埋めます。 この動作を無効にするには、_CrtSetDebugFillThreshold を使用します。

既定では、この関数のグローバル状態の適用対象は、アプリケーションになります。 この動作を変更するには、「CRT のグローバル状態」を参照してください

汎用テキスト ルーチンのマップ

Tchar.h のルーチン _UNICODE_MBCS が定義されていない _MBCS が定義されている _UNICODE が定義されている
_tmktemp_s _mktemp_s _mktemp_s _wmktemp_s

nameTemplate 引数の形式は baseXXXXXX です。ここで base は新しいファイル名の一部として指定される内容であり、各 X は _mktemp_s によって指定される文字のプレースホルダーです。 nameTemplate 内の各プレースホルダー文字は大文字の X である必要があります。_mktemp_s では、base を保持し、最初の後続の X を英字 1 文字で置換します。 _mktemp_s は、その後の X 文字を 5 桁の値に置き換えます。 この値は、呼び出し元のプロセス、またはマルチスレッド プログラムの呼び出し元スレッドを識別する一意の番号です。

呼び出しが成功した _mktemp_s ごとに、nameTemplate が変更されます。 同じプロセスまたはスレッドによる同じ nameTemplate 引数を使用した後続の呼び出しごとに、_mktemp_s では、以前の呼び出しで _mktemp_s が返した名前と一致するファイル名がないかチェックします。 指定した名前のファイルが存在しない場合、_mktemp_s はその名前を返します。 以前に返したすべての名前のファイルが存在する場合、_mktemp_s は、以前返した名前で使用していた英字 1 文字を、次の使用可能な小文字 1 文字 ('a' から 'z' の順) で置換することで、新しい名前を作成します。 たとえば、base が次の値で、

fn

_mktemp_s によって提供される 5 桁の値が 12345 の場合、返される最初の名前は、次のようになります。

fna12345

この名前を使用してファイル FNA12345 が作成され、このファイルがまだ使用されている場合、nameTemplate に同じ base を使用する同じプロセスまたはスレッドからの呼び出しで返される次の名前は、次のようになります。

fnb12345

FNA12345が存在しない場合、返される次の名前はもう一度です。

fna12345

_mktemp_sでは、指定された組み合わせとnameTemplate値に対して最大 26 個の一意のファイル名をbase作成できます。 そのため、FNZ12345 は、この例で使用されている basenameTemplate の値に対して _mktemp_s が作成できる最後の一意のファイル名です。

C++ では、これらの関数の使用はテンプレートのオーバーロードによって簡素化されます。オーバーロードでは、バッファー長を自動的に推論できる (サイズの引数を指定する必要がなくなる) だけでなく、古くてセキュリティが万全ではない関数を新しく安全な関数に自動的に置き換えることができます。 詳細については、「セキュリティで保護されたテンプレート オーバーロード」を参照してください

必要条件

ルーチンによって返される値 必須ヘッダー
_mktemp_s <io.h>
_wmktemp_s <io.h> または <wchar.h>

互換性の詳細については、「 Compatibility」を参照してください。

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

サンプル出力

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

関連項目

ファイル処理
fopen, _wfopen
_getmbcp
_getpid
_open, _wopen
_setmbcp
_tempnam, _wtempnam, tmpnam, _wtmpnam
tmpfile_s