2013-01-11 6 views
6

SQLiteデータベースファイルを開くと、ファイルの先頭に多くの読み込み可能なテキストがあります。-BファイルテストのためにSQLiteファイルが誤ってフィルタリングされる可能性はどれくらいありますか?-Bファイルテストの信頼性はどれくらいですか?

もちろん
The -T and -B switches work as follows. The first block or so of the file is 
examined for odd characters such as strange control codes or characters with 
the high bit set. If too many strange characters (>30%) are found, it's a -B 
file; otherwise it's a -T file. Also, any file containing a zero byte in the 
first block is considered a binary file. 

は、あなたは今のsqliteファイルの数の統計的分析を行うことができ、彼らの「最初のブロックを解析したり:

#!/usr/bin/env perl 
use warnings; 
use strict; 
use 5.10.1; 
use File::Find; 

my $dir = shift; 
my $databases; 

find({ 
    wanted  => sub { 
     my $file = $File::Find::name; 
     return if not -B $file; 
     return if not -s $file; 
     return if not -r $file; 
     say $file; 
     open my $fh, '<', $file or die "$file: $!"; 
     my $firstline = readline($fh) // ''; 
     close $fh or die $!; 
     push @$databases, $file if $firstline =~ /\ASQLite\sformat/; 
    }, 
    no_chdir => 1, 
}, 
$dir); 

say scalar @$databases; 
+0

'-T'と' -B'の詳細が書かれているとは思いません。つまり、将来のPerlのリリースで変更される可能性があります。そうすれば、それらは役に立たなくなるでしょう...この質問に対する良い答えはヒューリスティックの詳細を記述することです。私はいつも自分自身を疑問に思っています – Nemo

+0

これらはperlfuncで文書化されています。ここではすべてのファイル演算子が文書化されています。しかし、説明は曖昧です。 –

答えて

7

perlfunc manページを約-T-B言って、次があります「奇妙な文字」の場合は、その発生の確率を計算すると、-Bがsqliteファイルで失敗する確率を知ることができます。

ただし、簡単なルートを使用することもできます。それは失敗することができますか?はい、ヒューリスティックです。そしてそれは悪いものです。だから、それを使わないでください。

Unixでのファイル形式の認識は、通常、ファイルの内容を評価することによって行われます。そして、はい、すでにあなたのためにすべての仕事をしてきた人がいます:それはlibmagicfileコマンドラインツールを生成するもの)と呼ばれています。あなたはPerlからそれを例えば以下のように使うことができます。 File::MMagic

1

すべてのファイルは、技術的にはバイトの集合であり、したがってバイナリです。それ以外には、バイナリの定義は受け入れられていないので、評価する定義を怠ることがない限り、-Bの信頼性を評価することは不可能です。

関連する問題