ファイル名の扱いって難しい?
大昔…
MS-DOSと言うOSでは、
ファイル名は、半角大文字で字数8.3縛りでしか
使用できなかった…。
それが、WINDOWS95の
ロングファイルネームで
半角小文字はおろか漢字もOKになった。
…。
なぜ、こんな話しかと言うと
UNIX系だと、「ABC.txt」と「abc.txt」は、違うファイルだが
WINDOWS系だと、「ABC.txt」と「abc.txt」は、同じファイル。
これが、ツールを作る時に
意外な障害になる…。
例えば、以下のファイル名は、
WINDOWSでは、同じファイル?違うファイル?
『愛・憶えていますかⅡ.WAV』
『愛・憶えていますかⅱ.wav』
答え
2Kなら、同じファイル
9xなら、違うファイル
だったりする…。
「有りかよ!」と言いたくなる!
これは、スクリプトなどでファイ名を
手入力する場合ネックになる。
人間は、主観的な意識からファイル名を
変えたりする…。
「Macross.txt」を「macross.txt」など…。
と、思ったら…
OSだって勝手にファイル名を変更する。
9xだと…
ファイル名に2~8文字、拡張子に0~3文字の
半角大文字アルファベットだと
勝手にファイル名の大文字小文字を変更する。
「AAAAAAAA.TXT」は、「Aaaaaaaa.txt」になる。
2Kだとそんな事は、無い。
勝手に名前を変えるなんて止めろよ!
こんなちょっとの差異って、意外な所で『ガツン!』と来る。
ツールなんかで2つのファイル名を比較するとき
大抵「strcmp」を使う。普通こんなもん。
で!ガツンと不具合が出た!
調べると「stricmp」が良さそう…
しかし、「Ⅱ」と「ⅱ」が同じと判定してくれない…。
こんないい加減な世の中だから
良い加減にチェックしてくれるものは、
無い物かと更に調べると…
「_mbsnicoll」と言う物を見つけた…。
#include<mbstring.h>
#include<string.h>
#include<stdio.h>
void main(void)
{
char*name_a="SAMPLE";
char*name_b="sample";
char*name_c="SAMPLEⅡ";
char*name_d="sampleⅱ";
printf(strcmp(name_a,name_b)==0?"OK!:":"NG!:");
printf(stricmp(name_a,name_b)==0?"OK!:":"NG!:");
printf(_mbsnicoll(name_a,name_b,strlen(name_a))==0?"OK!\n":"NG!\n");
printf(strcmp(name_c,name_d)==0?"OK!:":"NG!:");
printf(stricmp(name_c,name_d)==0?"OK!:":"NG!:");
printf(_mbsnicoll(name_c,name_d,strlen(name_c))==0?"OK!\n":"NG!\n");
}
結果
NG!:OK!:OK!
NG!:NG!:OK!
上記のようなファイル名の違いを吸収してくれる優れもの。
ファイル名で悩んでいるあなた!
この機会に一度使用してみては?
…
チョット自分の苦労を
言いたかったのさ!
| 固定リンク
コメント