Share via


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

失敗時會設定 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