💡
既存のファイルと被りがないファイル名を作成する。mktemp
背景
既存のファイルと被りがないファイルを作成したかった。
今回は、短時間に複数ファイルが作成されるため、時間を使ったファイル名の作成は候補から外した。
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