« ようやく復活。 | トップページ | インテルマックのウインドウズ化! »

2006年4月 9日 (日)

ファイル名の扱いって難しい?

大昔…
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!

上記のようなファイル名の違いを吸収してくれる優れもの。

ファイル名で悩んでいるあなた!
この機会に一度使用してみては?



チョット自分の苦労を
言いたかったのさ!

|

« ようやく復活。 | トップページ | インテルマックのウインドウズ化! »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック

この記事のトラックバックURL:
http://app.cocolog-nifty.com/t/trackback/108365/9497169

この記事へのトラックバック一覧です: ファイル名の扱いって難しい?:

« ようやく復活。 | トップページ | インテルマックのウインドウズ化! »