_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 適時地自動處理多位元組字元字串參數,根據目前執行階段系統中的多位元組編碼頁來辨認多位元組字元序列。_wmktemp 是 _mktemp 的寬字元版本,_wmktemp 函式的參數和回傳值是寬字元字串。_wmktemp 和 _mktemp 行為相同,除了 _wmktemp 不處理多位元組字元字串。
泛用文字常式對應
Tchar.h 常式 |
未定義的 _UNICODE 和 _MBCS |
已定義 _MBCS |
已定義 _UNICODE |
---|---|---|---|
_tmktemp |
_mktemp |
_mktemp |
_wmktemp |
template 參數的形式為 baseXXXXXX,其中 base 是您提供的新檔名的一部份,而每個 X 代表 _mktemp 提供的占位符字元。每個在 template 中的占位符字元必須是大寫字母 X 。_mktemp 保留 base 並以一個字母字元取代第一個結尾的 X 。_mktemp 以一個五位數值取代接下來的末尾 X ,此值是一個唯一的代表呼叫處理程序的數字,或在多執行緒的應用程式裏代表呼叫執行緒。
每次成功地呼叫 _mktemp 都會修改 template 。同一個處理程序或執行緒接下來每次以相同的 template 呼叫_mktemp 時,它會檢查檔案名稱是否與前一次呼叫 _mktemp 所回傳的名字相符。如果給定的名字不存在, _mktemp 回傳相同的名字。如果每一個前次回傳的名字的檔案都存在, _mktemp 會透過將之前回傳的名字中的字母字元取代為下一個小寫字母,以 a 到 z 的順序。例如,當 base 是:
fn
而由 _mktemp 提供的五位數字是 12345,則第一個回傳的名字是:
fna12345
如果這個名稱用來建立檔案 FNA12345 而這個檔案仍存在,下一次同一個處理程序和執行緒以同樣的 base 所回傳給 template 的名字是:
fnb12345
如果 FNA12345 不存在,則傳回的會是:
fna12345
對於任何給定的基底與樣板值組合 _mktemp 可以建立最多 26 個唯一的檔案名稱。因此,在這個例子裏, FNZ12345 是最後一個 _mktemp 可以為 base 和 template 值來建立的唯一檔名。
在錯誤發生時, errno 會被設置。如果 template 的格式無效 (例如,小於 6 個 X) , errno 會被設為 EINVAL 。如果 _mktemp 因為所有 26 個可能的檔案名稱均已經存在而無法建立唯一的名稱, _mktemp 設定樣板為空字串並回傳 EEXIST 。
在 C++ 中,這些函式有多載樣板可以調用更新、更安全的這些函式的相對版本。如需詳細資訊,請參閱安全範本多載。
需求
程序 |
必要的標頭檔 |
---|---|
_mktemp |
<io.h> |
_wmktemp |
<io.h> 或 <wchar.h> |
如需更多關於相容性的資訊,請參閱入門介紹中的 相容性 (Compatibility) 。
範例
// 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。 如需更多的資訊,請參閱 平台調用範例 (Platform Invoke Examples) 。