Windowsでファイル名をまとめて変更しようとしていた。
で、何かスクリプト言語でちょろっと書いて一気に変換みたいなことをやろうと最初は思っていたのだけど、結局C言語でプログラムを書いてしまった。
ところがANSI版のAPIで書いたらMoveFileでうまく変更できないファイル名が出てきたので、Unicode対応のMoveFileWを使って書き直す等、もとのANSI版のAPIのプログラムをだいぶ書き直して動かした。
フォルダ内のファイルをスキャンしていくのにFindFirstFileWとFindNextFileWというAPIを使う。
使用する構造体はWIN32_FIND_DATAでなく、WIN32_FIND_DATAWを使う。
ファイル名はANSI版ならヌル文字を終端に入れたchar型の配列でよいのだけど、Unicode版はwchar_t型の配列を使う。
wchar_t配列型の文字列のフォルダ名やファイル名などを加工するのに、strcpyやstrcatが使えないので代わりにwcscpyやwcscatを使った。
文字定数は”foo”などと書く代わりにL”foo”と書いてUnicodeにしておかなければならない。
コマンドラインで動かすプログラムなのだけど、Unicodeを表示させるためにprintfでは駄目なので、printf(“%s”,str)と書くかわりにwprintfを使ってwprintf(L”%ls”,wstr)となどと書く。
cmd.exeから動かすとwprintfの表示が文字化けしてしまう。
コードページを変更するコマンドを使ってもどうもうまくいかない。
cmd.exeを使わずにPowershellで実行するとちゃんとwprintfの表示ができた。
知っている人にはきっと今更な話だが、ずっと自分はANSI版のAPIしか触ってなかったので。
—
つづく