テンポラリファイルの作成

※注意:このTIPSについては、ファイル名に2バイト文字が含まれる場合は動作が保証されません (strrchr APIの第1引数に2バイト文字が含まれた場合、上位または下位のいずれかが第2引数と一致するケースで問題となります)。
ご指摘くださった☆さんには厚く御礼申し上げます。

テンポラリファイルを作成するには、GetTempFileName APIを使用するのがよい。 このAPIを使えばファイル名が一意となるテンポラリファイルが簡単に作成できるからである。

	// GetTempPath APIでテンポラリファイル用のディレクトリパスを取得
	char lpszTempPath[MAX_PATH];
	if( ::GetTempPath(MAX_PATH, lpszTempPath) == 0 )
	{
		::AfxMessageBox("エラー");
		return;
	}

	// テンポラリファイルの作成
	char lpszTempFileName[MAX_PATH];
	if( ::GetTempFileName(lpszTempPath, "ini", 0, lpszTempFileName) == 0 )
	{
		::AfxMessageBox("エラー");
		return;
	}

	……

	// テンポラリファイルの削除
	::remove(lpszTempFileName);
GetTempFileName APIでは、第1引数にテンポラリファイルを作成するディレクトリのパスを指定する。 第2引数にはテンポラリファイル名の先頭につける文字列を指定する(3文字まで有効)。上記の例の場合、 作成されるテンポラリファイル名は"inixxx.tmp"と先頭に"ini"がつけられるようになる。 第3引数に0を指定すると、テンポラリファイルの一意性が保証され、なおかつテンポラリファイルが実際に作成される。 第4引数には作成されたテンポラリファイルのフルパス名を格納する領域を指定する。

上記の例ではテンポラリファイルの作成場所としてGetTempPath APIを使用している。 通常Windowsがテンポラリファイル用のディレクトリを用意しており、この関数を使えばそのディレクトリが取得できる (万が一用意されていない場合、この関数はカレントディレクトリを返す)。
次の例では、実行ファイルと同じディレクトリにテンポラリファイルを作成する場合の方法を示す。

	// GetModuleFileName APIで実行ファイルのフルパス名を取得
	// 実行ファイルのパス名を取得する場合は第1引数をNULLにしてもよい
	char lpszCurrentPath[MAX_PATH];
	if( ::GetModuleFileName(::AfxGetInstanceHandle(), lpszCurrentPath, MAX_PATH)
		== 0 )
	{
		::AfxMessageBox("エラー");
		return;
	}

	// strrchrを使い、lpszCurrentPathから最後のファイル名の部分を消す
	char* lpFileName = ::strrchr(lpszCurrentPath, '\\');
	*lpFileName = '\0';

	// テンポラリファイルの作成
	char lpszTempFileName[MAX_PATH];
	if( ::GetTempFileName(lpszCurrentPath, "ini", 0, lpszTempFileName) == 0 )
	{
		::AfxMessageBox("エラー");
		return;
	}

	// テンポラリファイルの削除
	::remove(lpszTempFileName);

目次へ