kkamegawa's weblog

Visual Studio,TFS,ALM,VSTS,DevOps関係のことについていろいろと書いていきます。Google Analyticsで解析を行っています

GetTempFileNameが基準とする時間

GetTempFileName 関数
このAPIの第三引数は一意な値をシステム時刻から取得して、実際にファイルを作成するとあります。

0 を指定すると、この関数は、lpPrefixString パラメータで指定した接頭辞に、システム時刻に基づいて生成された 16 進文字列を連結します。この場合、一時ファイルの一意の名前が得られるまで、この関数は毎回異なった値を使います。

で、こんなプログラムを書いてみました。シグナルを使っていないので、あまり厳密ではありません。

#include "stdafx.h"

#include <windows.h>
TCHAR gszFileName[10][_MAX_PATH + 1];
TCHAR gzTemp[_MAX_PATH + 1];
DWORD dwThreadID[10];

DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
	int id;
	for(int i = 0;i < 10;i++) {
		if(dwThreadID[i] == GetCurrentThreadId()) {
			id = i;
			break;
		}
	}
	GetTempFileName(gzTemp, _TEXT("Tmp"), 0, gszFileName[id]);

	return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
	HANDLE hThread[10];
	GetEnvironmentVariable(_TEXT("TEMP"), gzTemp, _MAX_PATH);
	
	for(int i = 0;i < 10;i++) {
		hThread[i] = CreateThread(NULL, 0,ThreadProc, &i, CREATE_SUSPENDED, &dwThreadID[i]);
	}

	for(int i = 0;i < 10;i++) {
		ResumeThread(hThread[i]);
	}

	WaitForMultipleObjects(10, hThread, TRUE, INFINITE);

	for(int i = 0;i < 10;i++) {
		_tprintf(_TEXT("%s"), gszFileName[i]);
		CloseHandle(hThread[i]);
	}

	return 0;
}

10のテンポラリファイルを10のスレッドで作ってみます。一応秒までは一緒だったので、秒未満であるようです。これが一台のマシンで作るならばたぶん大丈夫なのでしょうけど、複数のサーバーから同時に共有フォルダみたいなところに作ると、時刻の都合などで意外に待たされるのかもしれません。その辺はもうちょっと調べないといけないのかな?
おそらくMS-DOS系の名残で8+3の名前に収まるような名前を付ける必要があって、APIの仕様が決まっているのでしょうが、Exとか作ってもう少し長いファイル名をサポートするとかしてほしいとも思いますが…この仕様に満足できない人は自作しているんでしょうか?
ちなみに時間を元にしているという説明の通り、これでtmpファイルを作成するとファイル名が見事に連続した名前になってます…。
(追記)
環境を書き忘れていましたね。Windows 7 x64 Ultimate, 6GB RAM,Core i7 960という環境なので、見掛け上8coreありますので、10スレッドでも余裕です。