2013-01-11 32 views
6

Khi tôi mở tệp cơ sở dữ liệu SQLite, có rất nhiều văn bản có thể đọc được ở đầu tệp - cơ hội mà tệp SQLite được lọc sai đi do kiểm tra tệp -B?Kiểm tra tệp -B đáng tin cậy như thế nào?

#!/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ôi không nghĩ rằng các chi tiết của '-T' và' -B' được ghi lại, có nghĩa là chúng có thể thay đổi trong bản phát hành tương lai của Perl, tôi cho là vậy. Sau đó, một lần nữa, điều đó sẽ làm cho họ vô dụng ... Một câu trả lời hay cho câu hỏi này sẽ mô tả chi tiết của các chẩn đoán. Tôi luôn tự hỏi bản thân mình – Nemo

+0

Chúng được ghi lại trong perlfunc, nơi tất cả các toán tử tệp được ghi lại. Mô tả là mơ hồ, mặc dù. –

Trả lời

7

Trang perlfunc người đàn ông có những điều sau đây để nói về -T-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. 

Tất nhiên bây giờ bạn có thể làm một phân tích thống kê của một số tập tin SQLite, phân tích cú pháp "khối đầu tiên của họ hoặc vì vậy "cho" các ký tự lẻ "", tính toán xác suất xảy ra của chúng, và điều đó sẽ cho bạn một ý tưởng về khả năng nó bị lỗi -B đối với các tệp sqlite.

Tuy nhiên, bạn cũng có thể đi tuyến đường dễ dàng. Nó có thể thất bại không? Vâng, đó là một heuristic. Và một điều tồi tệ ở đó. Vì vậy, không sử dụng nó.

Nhận dạng kiểu tệp trên Unix thường được thực hiện bằng cách đánh giá nội dung của tệp. Và có, có những người đã thực hiện tất cả công việc cho bạn rồi: nó được gọi là libmagic (thingy có công cụ dòng lệnh file). Bạn có thể sử dụng nó từ Perl với ví dụ: File::MMagic.

1

Vâng, tất cả các tệp về mặt kỹ thuật là tập hợp các byte và do đó là nhị phân. Ngoài ra, không có định nghĩa nhị phân được chấp nhận, vì vậy không thể đánh giá độ tin cậy của -B trừ khi bạn quan tâm đến việc định nghĩa một định nghĩa mà nó được đánh giá.