2017-05-09 9 views
0

私は、ファイルマネージャを設計し、これらのいずれかの方法は、より効率的になる仮説的に、そのタイプによってファイルの検索を実装したいんだと仮定 -特定の種類のファイルを検索するのに、どちらが効率的になりますか?

  1. ファイルの名前を使用し、拡張子をトリム各ファイルの

  2. たとえば、jpegイメージの場合、検索するファイルの種類に特定のバイトを使用します。

bytes 0xFF, 0xD8 indicate start of image 

bytes 0xFF, 0xD9 indicate end of image 
+0

スタックオーバーフローは通常仮想質問を処理しません。しかし、ファイル名に基づいて決定を下すことは、データを開いたり見たりするよりもはるかに速くなることは明らかです。 – lit

+0

ファイル名がファイル内のコンテンツの種類を実際に表していることをどのように保証していますか?それは問題ですか? – Soren

+0

はい、偽陽性でないことが重要です – varnit

答えて

1

あなたはそれが前にそれを開いて、ファイル名を知っている必要があるため、名前トリムオプションは、おそらく速くなります。ただし、拡張子が実際のファイルタイプと一致しない場合は、そのメソッドで誤った結果が出る可能性があります。

このようにすると、システムコール(オープン、読み取り、多分fseek、クローズ)を省くことができます。

0

あなたの目標は「実際のデータをチェックすることによってそれ以上の制限なしにファイルをそのタイプで検索する」ことです。

しかし、一部の誤検出や偽陰性では問題ありません。拡張子のみを検索して画像ファイルを検索している場合は、画像ファイルの場合は「image.jpg」、偽陰性の場合は「image.jpg?width = 1024 & height = 800」が得られます。 "" image.exe "の代わりに、偽陽性です。

もう一方の側で、ファイルの最初の2つのバイトをチェックすることができます - イメージデータのほとんどのスキームは個々のヘッダーを持っています。この方法は、より少ない障害点を有する。イメージファイルのヘッダーに似ている最初のバイトを持つランダムなデータの塊がある場合、偽陽性を得ることができます。可能性はありますが、ほとんどありそうもありません。ヘッダーが削除された場合は、偽のネガティブな情報を得ることができます(たとえば、転送中、何らかの形で、またはファイルを作成した悪いスクリプトで)。また可能であり、そうでない可能性もあります。もしそうでなければ、多くはです。

小さなUnixツールfileはこれを実行し、かつては簡単にテキストファイルを解析できました。あなた自身のプロジェクトに使用することができました。現在では、インストールされていない複数の単一ファイルを含む大きなフォルダがプリコンパイルされた形式でのみ存在します。たとえば、http://bazaar.launchpad.net/~ubuntu-branches/ubuntu/saucy/file/saucy/files/head:/magic/Magdir/という形式のテキストファイルを含むフォルダを見つけることができます。この形式は、オンラインのmagic(5)のマンページに記載されています。例:https://linux.die.net/man/5/magic

+0

明確な説明をありがとう – varnit

関連する問題