ファイル名に使用できない文字を判別する

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に「ファイル名として正しいかどうかを調べる」を掲載しました。
ウィキペディアの「ファイル名の項」を参考にして、予約されているファイル名の検証も追加しています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください