_mktemp_s
, _wmktemp_s
建立唯一的檔案名稱。 這些函式是 _mktemp
, _wmktemp
的版本,具有 CRT 中的安全性功能中所述的安全性增強功能。
語法
errno_t _mktemp_s(
char *nameTemplate,
size_t sizeInChars
);
errno_t _wmktemp_s(
wchar_t *nameTemplate,
size_t sizeInChars
);
template <size_t size>
errno_t _mktemp_s(
char (&nameTemplate)[size]
); // C++ only
template <size_t size>
errno_t _wmktemp_s(
wchar_t (&nameTemplate)[size]
); // C++ only
參數
nameTemplate
檔案名稱模式。
sizeInChars
緩衝區的大小 (以 _mktemp_s
中的單一位元組字元數或 _wmktemp_s
中的寬字元數為單位),包括 Null 結束字元。
傳回值
如果成功,這兩個函式會傳回零;如果失敗,則傳回錯誤碼。
錯誤條件
nameTemplate |
sizeInChars |
傳回值 | 中的新值 nameTemplate |
---|---|---|---|
NULL |
任意 | EINVAL |
NULL |
格式不正確(如需正確格式,請參閱一節) | 任意 | EINVAL |
空字串 |
任意 | <= X 個字元的數目 | EINVAL |
空字串 |
如果發生上述任何錯誤狀況,則會叫用無效的參數處理程式,如參數驗證中所述。 如果允許繼續執行,errno
會設定為 EINVAL
,且函式會傳回 EINVAL
。
備註
_mktemp_s
函式會藉由修改 nameTemplate
引數來建立唯一的檔案名稱,因此在呼叫後,nameTemplate
指標會指向包含新檔案名稱的字串。 _mktemp_s
會自動適當地處理多位元組字元字串引數,並根據執行階段系統目前使用的多位元組字碼頁來辨識多位元組字元序列。 _wmktemp_s
是 _mktemp_s
的寬字元版本;_wmktemp_s
的引數是寬字元字串。 _wmktemp_s
和 _mktemp_s
的行為相同,不同之處在於 _wmktemp_s
不會處理多位元組位元元串。
這些函式的偵錯連結庫版本會先將緩衝區填入0xFE。 若要停用此行為,請使用 _CrtSetDebugFillThreshold
。
根據預設,此函式的全域狀態會限定於應用程式。 若要變更此行為,請參閱 CRT 中的全域狀態。
一般文字常式對應
Tchar.h 常式 | _UNICODE 和 _MBCS 未定義 |
_MBCS 已定義 |
_UNICODE 已定義 |
---|---|---|---|
_tmktemp_s |
_mktemp_s |
_mktemp_s |
_wmktemp_s |
nameTemplate
引數的格式為 baseXXXXXX
,其中 base
是您所提供之新檔案名稱的一部分,而每個 X 是 _mktemp_s
所提供的字元預留位置。 nameTemplate
中的每個預留位置字元必須是大寫 X。_mktemp_s
會保留 base
,並以字母字元取代後置 X 的第一個 X。 _mktemp_s
會以五位數的值取代後面的 X 個字元。 這個值是可識別呼叫進程,或在多線程程式中呼叫線程的唯一數位。
每次成功呼叫 _mktemp_s
都會修改 nameTemplate
。 之後,每次使用相同的 nameTemplate
引數從相同的處理序或執行緒呼叫時,_mktemp_s
都會檢查是否有任何檔案名稱符合先前呼叫中 _mktemp_s
所傳回的名稱。 如果指定的名稱不存在檔案,_mktemp_s
會傳回該名稱。 如果之前傳回的所有名稱都存在檔案,_mktemp_s
會以從 'a' 到 'z' 的順序中下一個可用的小寫字母,取代先前傳回的名稱中所使用的字母字元,以建立新的名稱。 例如,如果 base
是:
fn
而且 _mktemp_s
所提供的五位數值為 12345,則第一個傳回的名稱會是:
fna12345
如果此名稱會用來建立檔案 FNA12345,而且此檔案仍然存在,使用 nameTemplate
的相同 base
從相同的處理序或執行緒呼叫時所傳回的下一個名稱會是:
fnb12345
如果FNA12345不存在,則傳回的下一個名稱會再次傳回:
fna12345
_mktemp_s
可以為任何指定的 和 nameTemplate
值組合base
建立最多 26 個唯一檔名。 因此,FNZ12345 是 _mktemp_s
可為此範例中所使用的 base
和 nameTemplate
值建立的最後一個唯一檔案名稱。
C++ 利用多載樣板簡化了這些函式的使用方式。多載可自動推斷緩衝區長度 (因而不須指定大小引數),也可以將不安全的舊函式自動取代成較新且安全的對應函式。 如需詳細資訊,請參閱安全範本多載。
需求
常式 | 必要的標頭 |
---|---|
_mktemp_s |
<io.h> |
_wmktemp_s |
<io.h> 或 <wchar.h> |
如需相容性詳細資訊,請參閱相容性。
範例
// crt_mktemp_s.cpp
/* The program uses _mktemp to create
* five unique filenames. It opens each filename
* to ensure that the next name is unique.
*/
#include <io.h>
#include <string.h>
#include <stdio.h>
char *fnTemplate = "fnXXXXXX";
char names[5][9];
int main()
{
int i, err, sizeInChars;
FILE *fp;
for( i = 0; i < 5; i++ )
{
strcpy_s( names[i], sizeof(names[i]), fnTemplate );
/* Get the size of the string and add one for the null terminator.*/
sizeInChars = strnlen(names[i], 9) + 1;
/* Attempt to find a unique filename: */
err = _mktemp_s( names[i], sizeInChars );
if( err != 0 )
printf( "Problem creating the template" );
else
{
if( fopen_s( &fp, names[i], "w" ) == 0 )
printf( "Unique filename is %s\n", names[i] );
else
printf( "Cannot open %s\n", names[i] );
fclose( fp );
}
}
return 0;
}
範例輸出
Unique filename is fna03188
Unique filename is fnb03188
Unique filename is fnc03188
Unique filename is fnd03188
Unique filename is fne03188
另請參閱
檔案處理
fopen
, _wfopen
_getmbcp
_getpid
_open
, _wopen
_setmbcp
_tempnam
、 、 _wtempnam
、 tmpnam
_wtmpnam
tmpfile_s