Win2000とXPと7のGetTempFileName の動作の違い
uUnique パラメータで 0 を指定した場合、GetTempFileName 関数は現在のシステム時刻に基づいて一意の数値を生成しようとします。この結果 1 つの名前が得られますが、同じ名前のファイルが既に存在している場合、数値の値を 1 増やして同様に名前の作成と一意かどうかのテストを行います。一意のファイル名が見つかるまで、この関数は作成とテストを繰り返します。そして、一意のファイル名を使ってファイルを作成し、そのファイルを閉じます。uUnique で 0 以外の値を指定した場合、この関数はファイル名が一意かどうかテストすることはありませんし、ファイルを実際に作成せず、ファイルを開くこともありません |
一番利用されるシナリオと考えられる uUnique パラメーターにて 0 が設定されている場合に限定しますと、このようなメカニズムで一意なファイル名を生成します
a) ミリ秒単位で取得できるシステム起動からの経過時間に、0 から 1 ずつ加算されるstatic ローカル変数を加算する。 b) a) の static ローカル変数に対して、1 加算する。 c) 加算結果の下位16ビットを使って、lpPrefixString で設定された接頭辞+16 進文字列を作成する d) c) で生成された文字列をファイル名としてCreateFile() でファイル ハンドルを取得し、同じファイルが存在していないか確認する。 e) d) でファイルハンドルが取得できない場合、a) からやり直しを行う。 * 65535 回リトライを実施して取得できない場合は一時ファイル名の作成に失敗したとして 0 を返します。これにより、無限ループを防いでいます。 |
ところが、どうもこの関数、 Windows 2000 / XP / Windows 7 で動作が異なるようなのです
Windows 2000
・システムを起動してから 1から順番に1ずつ増えていく
Windows XP
・システムを起動してからはじめて実行した時のSystemTime を元に作成した数字を1ずつ増やしていく
Windows 7
・この関数を呼び出した時の SystemTime を元にした数字を返す。ファイルが重複した場合は1ずつ増やす試行を行う。
全然違いますね ・ω・ なんだこりゃ?
Comments