_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
します。 TMP_MAX
を超えて試行すると、エラーが発生する可能性があります (STDIO を参照してください。H) tmpnam
を使用した呼び出し、または_tempnam
を使用していて、TMP
環境変数と dir
パラメーターに無効なディレクトリ名が指定されている場合。
Note
tmpnam
と _wtmpnam
によって返されるポインターは、内部の静的バッファーを指します。 free
これらのポインターの割り当てを解除するために呼び出す必要はありません。 _tempnam
および _wtempnam
によって割り当てられたポインターに対して、free
を呼び出す必要があります。
解説
これらの各関数は、現在存在しないファイルの名前を返します。 tmpnam
は、 GetTempPathW
によって返される指定された Windows 一時ディレクトリ内で一意の名前を返します。 _tempnam
は、指定されたディレクトリ以外のディレクトリに一意の名前を生成します。 ファイル名の先頭に円記号が付いていて、パス情報 ( \fname21
など) がない場合は、その名前が現在の作業ディレクトリに対して有効であることを示します。
tmpnam
については、この生成されたファイル名を str
で格納することができます。 str
が NULL
の場合、tmpnam
は内部の静的バッファーに結果を残します。 したがって後続の呼び出しは、この値を破棄します。 tmpnam
によって生成された名前を構成しているのは、プログラムで生成されたファイル名と、tmpnam
への最初の呼び出しの後は base 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
がマルチバイト文字列を処理しない点を除き、_wtempnam
と _tempnam
の動作は同じです。 ワイド文字を扱う場合は、_wtmpnam
ではなく tmpnam
を使用します。_wtmpnam
の場合、引数にはワイド文字列を指定します。また戻り値もワイド文字列です。 _wtmpnam
がマルチバイト文字列を処理しない点を除き、_wtmpnam
と tmpnam
の動作は同じです。
_DEBUG
と_CRTDBG_MAP_ALLOC
が定義されている場合、_tempnam
と_wtempnam
は、_tempnam_dbg
と_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> |
互換性の詳細については、「 Compatibility」を参照してください。
例
// crt_tempnam.c
// compile with: /W3
// This program uses tmpnam to create a unique filename in the
// temporary directory, and _tempname to create a unique filename
// in C:\\tmp.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char * name1 = NULL;
char * name2 = NULL;
char * name3 = 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);
}
// Unset TMP environment variable, then create a temporary filename in C:\tmp.
if (_putenv("TMP=") != 0) {
printf("Could not remove TMP environment variable.\n");
}
// With TMP unset, we'll use C:\tmp as the temporary directory.
// Create a temporary filename in C:\tmp with prefix "stq".
if ((name3 = _tempnam("c:\\tmp", "stq")) != NULL) {
printf("%s is safe to use as a temporary file.\n", name3);
}
else {
printf("Cannot create a unique filename\n");
}
// When name3 is no longer needed:
if (name3) {
free(name3);
}
return 0;
}
C:\Users\LocalUser\AppData\Local\Temp\sriw.0 is safe to use as a temporary file.
C:\Users\LocalUser\AppData\Local\Temp\stq2 is safe to use as a temporary file.
c:\tmp\stq3 is safe to use as a temporary file.