Share via


_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 可為此範例中所使用的 basenameTemplate 值建立的最後一個唯一檔案名稱。

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