💡

既存のファイルと被りがないファイル名を作成する。mktemp

2024/02/06に公開

背景

既存のファイルと被りがないファイルを作成したかった。
今回は、短時間に複数ファイルが作成されるため、時間を使ったファイル名の作成は候補から外した。
Mac OS.

既存のファイルと被りがないファイル名を作成する関数(mktemp)

mktempを使うと表題の機能が使える。
mkstempもあるが、ファイル名を出力したかったため、mktempを使った。
Unix系では使えるようだが、windowでは非推奨らしい。

mktempの使い方

引数に書き換え可能なテンプレート文字列を与えると、対応する場所を被りがない文字列で埋めてくれる。
テンプレート文字列は末尾にXが6つ入っている必要がある。
たまに仕様が違うらしいので、manを見ることを推奨。
manによると、56800235584 (62 ** 6) 種類のファイル名を作成することが可能らしい。

サンプルコード

#include <stdio.h>
#include <unistd.h>
#include <string.h>

int main(void){
    // Your code here!
    char tmp_cpr[] = "tempXXXXXX";
    char filename[30];
    
    strcpy(filename, tmp_cpr);
    mktemp(filename);
    printf("%s\n", filename);
    strcpy(filename, tmp_cpr);
    mktemp(filename);
    printf("%s\n", filename);
    
    return (0);
}

出力結果例 - テンプレート文字列のXが別の文字列で埋められている。

tempg11EI1
tempH0qzL0

Discussion