2011-06-23 5 views
1

私は現在、興味深いものより多くの問題を抱えています。特定のファイルのMIMEタイプを検出しています。 これは、ファイルに存在する情報のみを使用してMIMEタイプを推測しようとしていることを意味します。ファイルとは、名前と内容を持つ構造体を意味します。MIMEタイプの検出が正しく行われました

は、ここで私は、この問題を知っているソリューションです:

  • は、ファイル名に応じて、ファイルタイプを推測しようとしています。たとえば、ファイル名がfoo.txtの場合、MIMEタイプはtext/plain
  • とすることができます。コンテンツを使用するタイプ、特に通常はある種の魔法のコードを含む最初のバイトを特定しようとします。たとえば、ファイルが0xCAFEBABEのオクテットで始まる場合、mime-typeはapplication/x-java-classと見なすことができます。

この問題に対する2つのアプローチには、それぞれ利点と欠点があります。

最初の解決方法は非常に効率的ですが、ファイル名が正しく、拡張子があるものとします。 LICENSEまたはREADMEという名前のファイルのMIMEタイプを検出するにはどうすればよいですか?

2番目の手法はもう少し複雑で、実際にデータを読み取る必要があります。マジックコードを含むすべてのファイルでうまく動作しますが、他のファイルではうまく動作しません。 MS-DOS EXEファイル(マジックコードとしてMZで始まる)とという文字で始まる実際のtext/plainファイルの違いを示す方法がいくつかあります。他のファイルタイプ(txtcsv; htmlとvs xmlとの比較を考えた場合、同様の問題が多数発生します。これは、xhtmlです)。

ここに本当の質問があります: ファイルのMIMEタイプを効率的かつ確実に検出するにはどうすればよいですか?


いくつかのサイドノート:

  • 私は図書館のとてもたくさんを知っては、仕事をすることそこに存在します。私は図書館に興味がありません。私は手を汚すことに興味があります。
  • 特定の言語はありません。私は、特定の実装ではなく、一般的なアルゴリズムに興味があります。あなたがアルゴリズムではなく、ツールを求めているよう
+1

もちろん、この情報をデータとともに保存するのが最善の方法です。 OS Xは[UTIs](http://en.wikipedia.org/wiki/Uniform_Type_Identifier)を使ってこれを行います。しかし、それはここで助けにはならない、と私は思いますか? – You

答えて

1

あなたの質問への答えはおそらくちょうど「正規表現」です。実際にファイル内のパターンを探して、それが何であるかを決める最善の方法です。不確かな場合は、ファイル拡張子(利用可能な場合)を見ることができますが、それに頼るべきではありません。たとえば、UNIXシステムでは、OSはファイルを実行できるかどうかを決定する際にファイル拡張子を気にしません。したがって、ファイル拡張子は決して信頼されるべきではありません。

タスク自体は、アルゴリズムの観点からは些細です。異なるファイルタイプを識別する正規表現を収集します。しかし、それはたくさんの作業です。あなたが認識したいと思っているすべてのファイルタイプに対して、実際に最小限の偽陽性と偽陰性だけでファイルタイプを実際に認識する式を書くことができるように、 。

なぜ、他の人たちがすでに大きな投資をしている問題を解決しようとしているのですか?ご存じのように、最も普及している解決策は、UNIXツールfileとそのライブラリlibmagicです。これはあなたのプログラムで簡単に使用できます。最も一般的なスクリプト言語へのバインディングが存在します。 fileユーティリティの "マジック"データベースは、これまでに一度も聞いたことがないエキゾチックなファイルタイプについて知っていて、(何十年か何十年にもわたって普及していないため)今は38歳です。

+0

「これまで何度も聞いたことがないようなエキゾチックなファイルタイプを知ること」は、実用性のないものに多くのリソースを浪費しているという潜在的な欠点があります。この状況はncurses terminfoデータベースと非常によく似ています。99.99%以上のデータベースは普通の人には決して使用されません。 :-) –

関連する問題