_tempnam、_wtempnam、tmpnam、_wtmpnam
一時ファイルの作成に使用できる名前を生成します。 これらの関数のセキュリティを強化したバージョンについては、「tmpnam_s、_wtmpnam_s」を参照してください。
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
);
パラメーター
prefix
_tempnam 関数によって返される名前の前に付加する文字列。dir
TMP 環境変数がない場合、または TMP が有効なディレクトリでない場合に、ファイル名に使用されるパス。str
生成された名前を保持するポインターで、関数によって返される名前と同一。 これは、生成された名前を保存するときに便利な方法です。
戻り値
これらの関数は、生成された名前へのポインターを返します。エラーの場合は NULL を返します。 tmpnam で TMP_MAX (STDIO.H を参照) より多く呼び出しを試行した場合、または _tempnam を使用するときに TMP 環境変数と dir パラメーターに無効なディレクトリが指定されている場合は、エラーが発生することがあります。
注意
tmpnam と _wtmpnam で返されるポインターは、内部の静的バッファーを指します。 このポインターを解放するときには free を呼び出さないでください。 free は、_tempnam と _wtempnam で割り当てられたポインターの場合に呼び出します。
解説
これらの関数はそれぞれ、現在存在していないファイルの名前を返します。 tmpnam は、現在の作業ディレクトリで一意の名前を返し、_tempnam では、現在のディレクトリ以外のディレクトリに一意の名前を生成します。 \fname21 のように、ファイル名の前に円記号が付加され、パス情報がない場合は、そのファイル名が現在の作業ディレクトリに対して有効であることを示します。
tmpnam では、この生成されたファイル名を str に格納できます。 str が NULL の場合、tmpnam は静的な内部バッファーに結果を残します。 したがって、その次の関数呼び出しにより、この値は破棄されます。 tmpnam で生成する名前は、プログラムで生成されたファイル名とファイル拡張子から成ります。2 回目以降の tmpnam 呼び出しでは、ファイル名に基数 32 の連番のファイル拡張子が付きます。STDIO.H の TMP_MAX が 32,767 の場合は .1 ~ .vvu になります。
_tempnam は、以下の規則によって選択されたディレクトリに対し、一意のファイル名を生成します。
TMP 環境変数が定義され、有効なディレクトリ名に設定されている場合は、TMP で指定したディレクトリに対して一意のファイル名が生成されます。
TMP 環境変数が定義されていない場合、または存在しないディレクトリ名に設定されている場合、_tempnam は、一意名を生成するパスとしてパラメーター dir を使用します。
TMP 環境変数が定義されていない場合、または存在しないディレクトリ名に設定されている場合に、dir が NULL であるか存在しないディレクトリ名に設定されていると、_tempnam は現在の作業ディレクトリを使用して一意名を生成します。 存在しないディレクトリ名が TMP と dir の両方で指定された場合、_tempnam 関数の呼び出しは失敗します。
_tempnam で返される名前は、prefix とシーケンス番号を連結した文字列です。これで、指定したディレクトリ内で一意のファイル名になります。 _tempnam は、拡張子のないファイル名を生成します。 _tempnam は、malloc を使用して、ファイル名の領域を割り当てます。この領域が不要になった場合、プログラムで解放します。
_tempnam と tmpnam は、オペレーティング システムから取得した OEM コード ページに基づいてマルチバイト文字シーケンスを認識し、マルチバイト文字列の引数を適切な方法で自動的に処理します。 ワイド文字を扱う場合は、_tempnam ではなく _wtempnam を使用します。_wtempnam の場合、引数にはワイド文字列を指定します。また戻り値もワイド文字列です。 _wtempnam と _tempnam の動作は、_wtempnam がマルチバイト文字列を扱わない点を除いて同じです。 ワイド文字を扱う場合は、tmpnam ではなく _wtmpnam を使用します。_wtmpnam の場合、引数にはワイド文字列を指定します。また戻り値もワイド文字列です。 _wtmpnam と tmpnam の動作は、_wtmpnam がマルチバイト文字列を扱わない点を除いて同じです。
_DEBUG と _CRTDBG_MAP_ALLOC が定義されていると、_tempnam と _wtempnam は _tempnam_dbg and _wtempnam_dbg への呼び出しで置き換えられます。
汎用テキスト ルーチンのマップ
TCHAR.H のルーチン |
_UNICODE および _MBCS が未定義の場合 |
_MBCS が定義されている場合 |
_UNICODE が定義されている場合 |
---|---|---|---|
_ttmpnam |
tmpnam |
tmpnam |
_wtmpnam |
_ttempnam |
_tempnam |
_tempnam |
_wtempnam |
必要条件
ルーチン |
必須ヘッダー |
---|---|
_tempnam |
<stdio.h> |
_wtempnam, _wtmpnam |
<stdio.h> または <wchar.h> |
tmpnam |
<stdio.h> |
互換性の詳細については、「C ランタイム ライブラリ」の「互換性」を参照してください。
使用例
// crt_tempnam.c
// compile with: /W3
// This program uses tmpnam to create a unique filename in the
// current working directory, then uses _tempnam to create
// a unique filename with a prefix of stq.
#include <stdio.h>
#include <stdlib.h>
int main( void )
{
char* name1 = NULL;
char* name2 = 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);
}
同等の .NET Framework 関数
該当なし標準 C 関数を呼び出すには、PInvoke を使用します。詳細については、「プラットフォーム呼び出しの例」を参照してください。