プログラミングとか日常とかの覚書っぽいなにか
コマンドプロンプトでのファイル操作やエクスプローラのファイル検索をするときに、ファイルを一括で指定できるワイルドカード。Windows APIのFindFirstFile関数でも同じことが可能ですが、どうやらこのフィルタ機能を過信するのも良くないようです。 アスタリスク「*」やクエスチョンマーク「?」はワイルドカードと呼ばれ、「*」を0文字以上の任意の文字、「?」を任意の1文字を表す文字として、複数のファイルを指定するときのフィルタとして使用することができます。 例えば、エクスプローラのファイル検索で ab*.txt と入れれば、ファイル名が「ab」で始まり、拡張子が「txt」のファイルを検索することができますし、コマンドプロンプトで del proc??.log と打てば、現在のディレクトリのにあるファイルのう、ファイル名が「proc」で始まり、ファイル名の長さが6文字+拡張子「log」のファイルをすべて削除することができるというわけです。 FindFirstFile関数も同様の指定でファイル列挙ができるので、ソフト開発の場でも非常によく使われるのですが、1つ忘れられがちなのが、これらのワイルドカードによるフィルタ指定が、一般的な「長い形式のファイル名」だけでなく、同時に「短い形式のファイル名」もチェックの対象となるという事実。 Windowsでは、256文字までのファイル名をつけることができるのですが、そのような「長い形式のファイル名」に対応していない古いソフトウェアでも動作するように、ファイル名8文字+拡張子3文字を超える長さのファイル名を持つすべてのファイルは、通常のファイル名のほかに「短い形式のファイル名」が付けられています。 これは俗に「8.3形式」とも呼ばれていて、その名が示すとおりに「ファイル名8文字+拡張子3文字」となります。 例えば、 test200090621.txt という名前のファイルを作ったとき、このファイルにはこの名前とは別に TEST20~1.TXT という短い形式の名前が付けられます。Windows XPのエクスプローラでは短いファイル名を見ることができないようですが、コマンドプロンプトでディレクトリを移動して dir /x というように「/x」オプション付きのdirコマンドで調べることができます。 短い形式のファイル名の命名規則はちょっと複雑で、最初の4つまでは単に「~」の後ろの数字が増えるだけですが、それ以降は別の形になります。試しに順に作ってみたところ test200090621.txt → TEST20~1.TXT test200090622.txt → TEST20~2.TXT test200090623.txt → TEST20~3.TXT test200090624.txt → TEST20~4.TXT test200090625.txt → TE6848~1.TXT test200090626.txt → TE6C48~1.TXT という感じになりました。 さて、ここで、最初の文字が「t」で、ファイル名の最後が「1.txt」のファイルを削除したいとすると、コマンドプロンプトなら del t*1.txt とすればよいはず。普通ならば、これで最初の「test200090621.txt」だけが削除されるだろうと思ってしまうのですが、実際には test200090621.txt test200090625.txt test200090626.txt の3つが削除されてしまうという結果に。つまり短いファイル名である TE6848~1.TXT TE6C48~1.TXT が「t*1.txt」というフィルタに引っかかってしまって、削除されてしまったというわけです。 バッチファイルなどではワイルドカード指定をすることは非常に多いですし、プログラム中でもFindFirstFileで特定のフィルタ文字を指定することはよくあることなのですが、それが必ずしも目的のファイルだけを取ってきてくれるとは限らないということのようです。ワイルドカード指定で抽出された中から、さらに自前のフィルタ処理を行うことが必要ということを肝に銘じておいたほうがよさそうです。 長くなりましたが今回はこの辺で。 PR |
プロフィール
HN:
はむぱい
職業:
ソフト作ったりしてる人
Twitter
カテゴリー
カレンダー
ブログ内検索
あ~いい漢字
|