ファイルなのか、ディレクトリ(フォルダ)なのかの判別
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とかでごちゃごちゃやって、パスセパレータが連続してしまっても、ちゃんと消してくれるってわけですね。
将来的にも保障されるかどうかはわかりませんけど。そもそも、探したけれど情報が見つけられませんでした。