_tempnam、_wtempnam、tmpnam、_wtmpnam
更新 : 2007 年 11 月
一時ファイルの作成に使用できる名前を生成します。これらの関数のセキュリティを強化したバージョンについては、「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 コード ページに基づいてマルチバイト文字シーケンスを認識し、マルチバイト文字列の引数を適切な方法で自動的に処理します。_wtempnam はワイド文字列バージョンの _tempnam です。_wtempnam の引数と戻り値はワイド文字列です。_wtempnam と _tempnam の動作は、_wtempnam がマルチバイト文字列を処理しない点以外は同じです。_wtmpnam はワイド文字列バージョンの tmpnam です。_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);
}
\s1gk. is safe to use as a temporary file.
C:\DOCUME~1\user\LOCALS~1\Temp\2\stq2 is safe to use as a temporary file.
.NET Framework の相当するアイテム
適用できません。標準 C 関数を呼び出すには、PInvoke を使用します。詳細については、「プラットフォーム呼び出しの例」を参照してください。