PathGetCharTypeを使用すると、ファイル名に使用できない文字を判別することができます。
こんな便利な関数が用意されているとは知りませんでした。
ファイル名に使用できない文字の一覧表を作成して、チェックする必要はありませんでした。
サンプルコードです。
C++Builder2009で動作を検証しました。
#pragma hdrstop
#include <tchar.h>
#include <shlwapi.h>
#include <iostream>
#pragma argsused
#pragma link "shlwapi.lib"
using namespace std;
using namespace boost;
void CheckChar(wchar_t C)
{
const unsigned int result = PathGetCharType(C);
if (result & GCT_INVALID)
wcout << C << L" は不正な文字です。" << endl;
if (result & GCT_LFNCHAR)
wcout << C << L" は長いファイル名に使用できます。" << endl;
if (result & GCT_SEPARATOR)
wcout << C << L" は区切り文字です。" << endl;
if (result & GCT_SHORTCHAR)
wcout << C << L" は短いファイル名に使用できます。" << endl;
if (result & GCT_WILD)
wcout << C << L" はワイルドカード文字です。" << endl;
}
int _tmain(int argc, _TCHAR* argv[])
{
wcout.imbue(locale("japanese"));
const wchar_t chars[] = L"\\/:,;*?\"<>|aあ";
for (unsigned int i = 0; i < sizeof(chars) / sizeof(wchar_t); ++i)
{
CheckChar(chars[i]);
}
return 0;
}
実行結果
\ は区切り文字です。
: は区切り文字です。
, は長いファイル名に使用できます。
; は長いファイル名に使用できます。
* はワイルドカード文字です。
? はワイルドカード文字です。
a は長いファイル名に使用できます。
a は短いファイル名に使用できます。
あ は長いファイル名に使用できます。
あ は短いファイル名に使用できます。
追記
C++Builder Tipsに「ファイル名として正しいかどうかを調べる」を掲載しました。
ウィキペディアの「ファイル名の項」を参考にして、予約されているファイル名の検証も追加しています。