ファイルの種類の判定

ファイルの種類の判定は通常は拡張子によって判断すればよい。ただし、拡張子はどんなファイルにどんな拡張子をつけてもよいので、ファイルが「偽装」されることもある。たとえば、「excel.txt」というただのメモ帳のファイルでも、拡張子を付け替えて「excel.jpg」とすればJPEG画像ファイルのように扱われてしまう。

そこで、拡張子に頼らずにファイルの「中身」を読み込んで、それが確かに目的のファイルであるかどうか確かめてから、ファイルの処理をしようという必要性が出てくる。

これは、自分で作ったプログラムがバイナリファイルを作成するとき、それが本当にそのプログラムで作成されたものであるかを確認して使うという場面で効用があるものである。要するに、不適当なファイルは処理の対象から排除できるということである。「ファイルの種類の判定」の利用法はこの点にしかない1)
NOTES
1) エクセルバカにとってファイルの種類の判定は、同じエクセルバカ仲間に対して、「どうだ、オレはエクセルでこんな変わったことまでできるんだぜ」と自慢するためのものでしかない。

しかし、エクセルバカは何を血迷ったのか、勘違いしたものか、一般的にファイルの種類を判定しようとする。そんなことができるものだと思っているのである。バカは度し難い。

重要
まちがった知識ほどバカには理解しやすい。
エクセルバカは一般的に文字コードが判定ができるものだと思い込んでいる。
エクセルバカは一般的にファイルの種類が判別ができるものだと思い込んでいる。

しかし、エクセルバカの世界は想像を絶する壮大なバカの世界であり、無知蒙昧暗愚の世界である。
LOG
110.66.186.36 [10/May/2017:20:40:35] vba テキストファイル 識別
210.138.100.157 [30/Nov/2016:13:51:50] テキストファイル形式 機械判別
202.19.228.112 [14/Nov/2016:16:13:13] execl vb テキストファイルの種類の確認
こんな連中にはどんな知識や教説も無意味なことであろう。知識とは無縁の世界の生き物である。
LOG
219.127.96.121 [19/Nov/2016:15:32:08] VBA ファイルの文字コードを調べる
こんなバカが毎年必ず出てくる。エクセルバカは毎年毎年新入社員という形で大量生産されるからこの種のバカも永久に不滅だろう。


さて、バカの話はさておき、たとえば下記はリッチテキストファイルの冒頭部分の例である。

{\rtf1\ansi\ansicpg932\deff0\...

先頭5バイトの文字はどのファイルでも常に「{\rtf」で始まる。この部分をチェックすればそのファイルがリッチテキストファイルかそうでないかを判定できることになる。



判別の例

順に、ビットマップ(*.bmp)、実行型ファイル(*.exe)、リッチテキストファイル(*.rtf)の判別の例である。これらは拡張子ではなく、ファイルの中身をみて判定している。





こうするためには、ファイルの特定位置の特定部分(通常は数バイト/先頭でなくてもよい)だけをピンポイントで読み込んで処理する必要がある。したがってその判定も瞬時でできることになる。

ファイル全部を読み込むというオバカなことをすればすべては水泡に帰すだけである。こういう判定自体が無意味なものになる。


オバカの大好きなUnicodeファイルの判別

特にオバカは「ネコも杓子もUTF-8大好き病」に感染しているから以下はこれにからんだ余興である(笑)。

UTF-8の判定

Unicodeファイルの判別とその実用的使用のサンプルである。拡張子ではなく、ファイルの中身をみて判定している。




UTF-16の判定




応用例

これを応用すると、ファイルを読み込むときのチェックもできるようになる。


また、プログラムでUNICODEのテキストは「UTF-16LEのBOM付き」以外は処理しないようにしている場合、それに該当しないファイルを読み込もうとすると下記のようなメッセージが出て読み込まないようにもできる(事前に阻止する)。


ちなみに、このファイルチェックは下記のどの場合についても実行される。
  1. メニューからのファイル読み込み
  2. 最近使ったファイルからの読み込み
  3. ドラッグ&ドロップでの読み込み
  4. エクスプローラでのダブルクリック(拡張子起動)



この手法が使えるのは原則的にバイナリファイルで、しかも定位置(先頭でなくてもよい)にキーワードが埋め込まれているようなファイルに対して有効である。そうでなければ判定の「手がかり」がない。

なお、テキストファイルの文字コードまたはエンコードを一般的に判別する方法もない(常識)

上の例で使った「リッチテキストファイル(*.rtf)」、「ビットマップファイル(*.bmp)」、「実行型ファイル(*.exe)」、「UTF-8(UTF8識別子あり)」、「UTF-16(BOMあり)」などはすべて定位置にキーワードが埋め込んであるファイルの代表である。

他のバイナリファイルでもなにか目印になるようなキーワードが埋め込んであるのが普通である。これはプログラムを作成する者の間では常識になっている(はず)。それを自分の目的に合わせてチェックすればよい。

ファイルの種類の判定をするにはそういうキーワード(通常は非公表)を事前に知っていなければならない。たとえばファイルの特定の位置に「tamakin」とか「sachiko」などを、作り手が自由に設定して埋め込んでいるのが普通である。これがわからない限りファイルの種類の判定などは雲の上の話である。しかし、ネットバカは一般的にファイルの種類の判定ができるものだと思い込んでいるのである。

自分でプログラムを作っている場合は、自分のプログラムで使うファイルかどうかの判定は簡単にできるのである。自分がどの位置にキーワードを埋め込んだかを知っているから当然のことである。




文字コードごっこはバカの悲願

ネットバカは能もないのに「文字コードごっこ」だけは異常にやりたいらしい。文字コードごっこはネットバカの悲願。そんなにやりたかったらプログラミングの基本から覚えるのが一番だが、そんな「お勉強」はする気がない。結局は、バカなことを書いてインタネをハエのように飛び回るしかない。
LOG
223.134.124.38 [19/May/2013:12:29:08] \'82\'6c\'82\'72 \'96\'be\'92\'a9; 文字コード
180.42.11.37 [09/Dec/2014:10:58:33] \'82\'6c\'82\'72 \'96\'be\'92\'a9
16進数を見るとすぐにバイナリだとか文字コードだと騒ぎ出す。無知というのはかわいそうなものである。この部分は上の「例」の部分にある。この文字コードってことかな、ごっこ屋のボク。


こんなものは文字コードでも何でもない。解読プログラム(knj.cpp)を作って解読すると上のようになるが何の意味もない単なる符号である。[ccp_0355]を参照。




愚民列伝(b1)
Excelファイルかどうかの判定(tpc_0097)
バイナリ検索(tpc_0196)
ファイルの種類の判定(ipc_0016)


ファイルの種類の判定(win_0197)
バイナリかテキストかの判別(ccp_0302)




ドキュメント・ビュー・アーキテクチャー, バイナリファイルにヘッダー情報/定位置にキーワードを埋め込む(c1_0196) ファイルの種類の判定(Excel/VBA/pc6_0017)
Unicode,UTF-8,UTF-16,Big,Little,Endian,LE,BE,Shift_JIS,SJIS,CR,LF,CRLF,byte,bit,word,BOM, バイナリ,文字コード,16進コード,文字列,変換,ビッグ,リトル,エンディアン,ユニコード,改行,バイト,ビット, 半角,全角,カタカナ,ひらがな,カナ,漢字,エンコード,デコード,16進文字列,C言語,C++言語,解析, _mbslen,_mbsnccnt,_mbsnbcnt,_mbctombb(旧zentohan),_mbbtombc(旧hantozen),_mbctohira,_mbctokana, _mbctolower,_mbctoupper,_mbcjistojms,_mbcjmstojis,_mbbtype,_mbsbtype,mbstowcs,wcstombs,mbtowc,wctomb, マルチバイト,MBCS,char,unsigned,