_mktemp
, _wmktemp
建立唯一的檔案名稱。 這些函式已有更安全的版本可用,請參閱 _mktemp_s
、_wmktemp_s
。
語法
char *_mktemp(
char *nameTemplate
);
wchar_t *_wmktemp(
wchar_t *nameTemplate
);
template <size_t size>
char *_mktemp(
char (&nameTemplate)[size]
); // C++ only
template <size_t size>
wchar_t *_wmktemp(
wchar_t (&nameTemplate)[size]
); // C++ only
參數
nameTemplate
檔案名稱模式。
傳回值
所有這些函式都會傳回已修改之 nameTemplate 的指標。 如果nameTemplate
格式不正確或無法從指定的 nameTemplate 建立唯一名稱,則函式會傳回 NULL
。
備註
_mktemp
函式會藉由修改 nameTemplate
引數來建立唯一的檔案名稱。 _mktemp
會自動適當地處理多位元組字元字串引數,並根據執行階段系統目前使用的多位元組字碼頁來辨識多位元組字元序列。 _wmktemp
是 _mktemp
的寬字元版本,_wmktemp
的引數與傳回值是寬字元字串。 _wmktemp
和 _mktemp
的行為相同,不同之處在於 _wmktemp
不會處理多位元組位元元串。
根據預設,此函式的全域狀態會限定於應用程式。 若要變更此行為,請參閱 CRT 中的全域狀態。
一般文字常式對應
Tchar.h 常式 | _UNICODE 和 _MBCS 未定義 |
_MBCS 已定義 |
_UNICODE 已定義 |
---|---|---|---|
_tmktemp |
_mktemp |
_mktemp |
_wmktemp |
nameTemplate
引數的格式為 baseXXXXXX
,其中 base
是您所提供之新檔案名稱的一部分,而每個 X 是 _mktemp
所提供的字元預留位置。 nameTemplate
中的每個預留位置字元必須是大寫 X。_mktemp
會保留 base
,並以字母字元取代後置 X 的第一個 X。 _mktemp
以五位數的值取代尾端 X 字元。 這個值是可識別呼叫進程,或在多線程程式中呼叫線程的唯一數位。
每次成功呼叫 _mktemp
都會修改 nameTemplate
。 之後,每次使用相同的 nameTemplate
引數從相同的處理序或執行緒呼叫時,_mktemp
都會檢查是否有任何檔案名稱符合先前呼叫中 _mktemp
所傳回的名稱。 如果指定的名稱不存在檔案,_mktemp
會傳回該名稱。 如果之前傳回的所有名稱都存在檔案,_mktemp
會以從 'a' 到 'z' 的順序中下一個可用的小寫字母,取代先前傳回的名稱中所使用的字母字元,以建立新的名稱。 例如,如果 base
是:
fn
而且 _mktemp
所提供的五位數值為 12345,則第一個傳回的名稱會是:
fna12345
如果此名稱會用來建立檔案 FNA12345,而且此檔案仍然存在,使用 nameTemplate
的相同 base
從相同的處理序或執行緒呼叫時所傳回的下一個名稱會是:
fnb12345
如果FNA12345不存在,則傳回的下一個名稱會再次傳回:
fna12345
_mktemp
可以為任何指定的 和 nameTemplate
值組合base
建立最多 26 個唯一檔名。 因此,FNZ12345 是 _mktemp
可為此範例中所使用的 base
和 nameTemplate
值建立的最後一個唯一檔案名稱。
失敗時會設定 errno
。 如果 nameTemplate
格式無效(例如,少於六個 X 個字元), errno
則會設定為 EINVAL
。 如果 _mktemp
無法建立唯一名稱,因為所有 26 個可能的檔案名已經存在, _mktemp
請將 nameTemplate 設定為空字串並傳 EEXIST
回 。
在 C++ 中,這些函式具有樣板多載,可以叫用這些函式的更新且安全的對應版本。 如需詳細資訊,請參閱安全範本多載。
需求
常式 | 必要的標頭 |
---|---|
_mktemp |
<io.h> |
_wmktemp |
<io.h> 或 <wchar.h> |
如需相容性詳細資訊,請參閱相容性。
範例
// 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 );
}
}
}
Unique filename is fna03912
Unique filename is fnb03912
Unique filename is fnc03912
Unique filename is fnd03912
Unique filename is fne03912
Unique filename is fnf03912
Unique filename is fng03912
Unique filename is fnh03912
Unique filename is fni03912
Unique filename is fnj03912
Unique filename is fnk03912
Unique filename is fnl03912
Unique filename is fnm03912
Unique filename is fnn03912
Unique filename is fno03912
Unique filename is fnp03912
Unique filename is fnq03912
Unique filename is fnr03912
Unique filename is fns03912
Unique filename is fnt03912
Unique filename is fnu03912
Unique filename is fnv03912
Unique filename is fnw03912
Unique filename is fnx03912
Unique filename is fny03912
Unique filename is fnz03912
Problem creating the template.
Out of unique filenames.
另請參閱
檔案處理
fopen
, _wfopen
_getmbcp
_getpid
_open
, _wopen
_setmbcp
_tempnam
、 、 _wtempnam
、 tmpnam
_wtmpnam
tmpfile