_mktemp、_wmktemp
一意のファイル名を作成します。 これらの関数のセキュリティを強化したバージョンについては、「_mktemp_s、_wmktemp_s」を参照してください。
char *_mktemp(
char *template
);
wchar_t *_wmktemp(
wchar_t *template
);
template <size_t size>
char *_mktemp(
char (&template)[size]
); // C++ only
template <size_t size>
wchar_t *_wmktemp(
wchar_t (&template)[size]
); // C++ only
パラメーター
- template
ファイル名のパターン。
戻り値
これらの関数は、変更されたテンプレートへのポインターを返します。 template の形式が正しくない場合、または指定したテンプレートから一意の名前をそれ以上作成できない場合、この関数は NULL を返します。
解説
_mktemp 関数は、template 引数を変更して、一意のファイル名を作成します。 _mktemp 関数は、ランタイム システムで現在使用されているマルチバイト コード ページに従ってマルチバイト文字シーケンスを認識し、マルチバイト文字列の引数を適切な方法で自動的に処理します。 ワイド文字を扱う場合は、_mktemp ではなく _wmktemp を使用します。_wmktemp の場合、引数にはワイド文字列を指定します。また戻り値もワイド文字列です。 _wmktemp 関数と _mktemp 関数の動作は、_wmktemp 関数がマルチバイト文字列を扱わない点を除いて同じです。
汎用テキスト ルーチンのマップ
Tchar.h のルーチン |
_UNICODE および _MBCS が未定義の場合 |
_MBCS が定義されている場合 |
_UNICODE が定義されている場合 |
---|---|---|---|
_tmktemp |
_mktemp |
_mktemp |
_wmktemp |
template 引数の形式は baseXXXXXX です。ここで、base は、指定した新しいファイル名の一部で、X は、_mktemp で指定された文字のプレースホルダーです。 template の各プレースホルダー文字には、大文字の X を指定する必要があります。 _mktemp は base を保持し、後に続く X のうち先頭の X を英字に置き換えます。 さらに、_mktemp は残りの X を 5 桁の値に置き換えます。この値は、呼び出し元プロセス (マルチスレッド プログラムの場合は呼び出し元スレッド) を識別する一意の数字です。
_mktemp の呼び出しが成功するたびに、template が変更されます。 同じ template 引数を使用して同じプロセスまたはスレッドから呼び出されると、_mktemp は、前の呼び出しで _mktemp から返された名前と一致するファイル名を調べます。 指定した名前のファイルが存在しない場合、_mktemp はその名前を返します。 以前返されたすべての名前のファイルが存在する場合、_mktemp は、その名前の英字部分をアルファベット順の次の小文字に置き換えて、新しい名前を作成します。 たとえば、base が次のような場合があります。
fn
さらに、_mktemp で指定した 5 桁の値が 12345 の場合、最初に次の名前が返されます。
fna12345
この名前が FNA12345 ファイルの作成に使用され、そのファイルがまだ存在する場合、template に同じ base を指定して同じプロセスまたはスレッドを呼び出すと、次の名前が返されます。
fnb12345
FNA12345 が存在しない場合は、次の名前がもう一度返されます。
fna12345
_mktemp は、base 値と template 値をどのように組み合わせても、最大で 26 個の一意のファイル名を作成できます。 したがって、この例で使用されている base 値と template 値に対して _mktemp が作成できる最後の一意のファイル名は FNZ12345 になります。
失敗した場合は、errno が設定されます。 template の形式が無効である場合 (たとえば、X が 6 未満の場合)、errno は EINVAL に設定されます。 26 個のすべてのファイル名が既に存在することが原因で、_mktemp が一意の名前を作成できない場合、_mktemp は、テンプレートを空の文字列に設定し、EEXIST を返します。
C++ では、これらの関数にテンプレートのオーバーロードがあります。このオーバーロードは、これらの関数に対応するセキュリティで保護された新しい関数を呼び出します。 詳細については、「セキュリティ保護されたテンプレート オーバーロード」を参照してください。
必要条件
ルーチン |
必須ヘッダー |
---|---|
_mktemp |
<io.h> |
_wmktemp |
<io.h> または <wchar.h> |
互換性の詳細については、「C ランタイム ライブラリ」の「互換性」を参照してください。
使用例
// crt_mktemp.c
// compile with: /W3
/* The program uses _mktemp to create
* unique filenames. It opens each filename
* to ensure that the next name is unique.
*/
#include <io.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
char *template = "fnXXXXXX";
char *result;
char names[27][9];
int main( void )
{
int i;
FILE *fp;
for( i = 0; i < 27; i++ )
{
strcpy_s( names[i], sizeof( names[i] ), template );
/* Attempt to find a unique filename: */
result = _mktemp( names[i] ); // C4996
// Note: _mktemp is deprecated; consider using _mktemp_s instead
if( result == NULL )
{
printf( "Problem creating the template\n" );
if (errno == EINVAL)
{
printf( "Bad parameter\n");
}
else if (errno == EEXIST)
{
printf( "Out of unique filenames\n");
}
}
else
{
fopen_s( &fp, result, "w" );
if( fp != NULL )
printf( "Unique filename is %s\n", result );
else
printf( "Cannot open %s\n", result );
fclose( fp );
}
}
}
同等の .NET Framework 関数
該当なし標準 C 関数を呼び出すには、PInvoke を使用します。詳細については、「プラットフォーム呼び出しの例」を参照してください。