2013-01-11 5 views
6

Wenn ich eine SQLite-Datenbankdatei öffne, steht am Anfang der Datei eine Menge lesbarer Text - wie groß ist die Wahrscheinlichkeit, dass eine SQLite-Datei aufgrund des Datei-Tests -B falsch gefiltert wird?Wie zuverlässig ist der B-Dateitest?

#!/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

Ich glaube nicht, dass die Details von '-T' und' -B' dokumentiert sind, was bedeutet, dass sie sich in zukünftigen Versionen von Perl ändern könnten, nehme ich an. Aber das würde sie wiederum nutzlos machen ... Eine gute Antwort auf diese Frage würde die Details der Heuristik beschreiben. Ich habe mich immer gefragt – Nemo

+0

Sie sind in perlfunc dokumentiert, wo alle Datei-Operatoren dokumentiert sind. Die Beschreibung ist jedoch vage. –

Antwort

7

Die perlfunc Manpage hat die über -T und -B zu sagen folgendes:

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. 

Natürlich könnten Sie tun, jetzt eine statistische Analyse einer Reihe von SQLite-Dateien, analysieren ihre „ersten Block oder so "für" ungerade Zeichen ", berechnen Sie die Wahrscheinlichkeit ihres Auftretens, und das würde Ihnen eine Vorstellung davon geben, wie wahrscheinlich es ist, dass -B für SQLite-Dateien fehlschlägt.

Sie könnten jedoch auch die einfache Route gehen. Kann es scheitern? Ja, es ist eine Heuristik. Und eine schlechte dabei. Also benutze es nicht.

Die Dateityperkennung unter Unix erfolgt normalerweise durch Auswertung des Dateiinhalts. Und ja, es gibt Leute, die bereits die ganze Arbeit für Sie erledigt haben: Sie heißt libmagic (das Ding, das das Kommandozeilen-Tool file liefert). Sie können es von Perl mit z. File::MMagic.

1

Nun, alle Dateien sind technisch eine Sammlung von Bytes und somit binär. Darüber hinaus gibt es keine akzeptierte Definition von binär, daher ist es unmöglich, die Zuverlässigkeit von -B zu bewerten, es sei denn, Sie möchten eine Definition festlegen, nach der sie ausgewertet werden soll.

Verwandte Themen