ファイルなのか、ディレクトリ(フォルダ)なのかの判別

IsFile/IsDirectoryっていうのを作ってみました。動作確認はXPのみ。

インクルードするやつ

まずこんな感じのをコピってください。

#include <windows.h>
#include <tchar.h>

// PathIsDirectory()
#include <shlwapi.h>
#pragma comment(lib, "shlwapi.lib")

IsFile関数

// ファイルかどうかを識別する。
// falseが返された場合は、フォルダかもしれないし、他のエラーかもしれない。
BOOL IsFile( LPCTSTR _name)
{
	DWORD attributes = GetFileAttributes( _name);
	if(attributes == INVALID_FILE_ATTRIBUTES)
		return false;
	if(attributes & FILE_ATTRIBUTE_NORMAL)
		return false;

	// not dir --> file
	return true;
}

将来、「フォルダじゃない→ファイルだ」なんて二元的な関係はなくなるかもしれないので注意。
その点、CreateFile関数のほうが安全か?

追記10/03/17

上のバージョンは、c:\pagefile.sysなど、ロックされているファイルを調べようとすると、失敗するので、FindFirstFileを使うことにした。

BOOL IsFile( LPCTSTR _name)
{
	WIN32_FIND_DATA FindData;

	HANDLE hFind = FindFirstFile( _name, &FindData);
	if(hFind == INVALID_HANDLE_VALUE)
		return false;
	FindClose(hFind);
	if(!(FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY))
		return true;
	return false;
}

IsDirectory関数

// フォルダかどうかを確かめる
// trueが返されたらフォルダ。
// falseが返された場合は、ファイルかもしれないし、
// 何も存在しないかもしれないし、他のエラーかもしれない
BOOL IsDirectory( LPCTSTR _name)
{
	return PathIsDirectory( _name);
}

ファイル/フォルダどっちでもいいから、存在するかどうかだけ知りたいとき

FindFirstFile関数でもいけると思います。
きっと上の2つで代用できるので、書きませんが。

パスセパレータ(\ ←この記号)が重複してても、内部で消してくれるかもしれない

ちょっと気づいたことがあったので書いておきます。
たとえば、以下のようにメチャクチャなことをやっても、成功するんです。

if(PathIsDirectory( "C:\\\\\\\\\\\\\\\\windows")) {
// 中略
}

strcatとかでごちゃごちゃやって、パスセパレータが連続してしまっても、ちゃんと消してくれるってわけですね。
将来的にも保障されるかどうかはわかりませんけど。そもそも、探したけれど情報が見つけられませんでした。