我有许多由许多不同程序创建的数据文件。有没有办法确定用于创建数据文件的数据库和数据库版本。
例如,我想确定哪些文件是从 Microsoft Access、dBASE、FileMaker、FoxPro、SQLite 或其他创建的。
我真的只是想以某种方式快速扫描文件,并显示有关它们的信息,包括源数据库和版本。
作为参考,我使用的是 Delphi 2009。
我有许多由许多不同程序创建的数据文件。有没有办法确定用于创建数据文件的数据库和数据库版本。
例如,我想确定哪些文件是从 Microsoft Access、dBASE、FileMaker、FoxPro、SQLite 或其他创建的。
我真的只是想以某种方式快速扫描文件,并显示有关它们的信息,包括源数据库和版本。
作为参考,我使用的是 Delphi 2009。
首先,检查文件扩展名。查看相应的维基百科文章或其他网站。
然后你可以从它所谓的“签名”中猜出文件格式。
这主要是第一个字符的内容,它能够识别文件格式。
您在这个非常不错的 Gary Kessler网站上有一个更新的列表。
例如,下面是我们的框架如何在服务器端从文件内容中识别 MIME 格式:
function GetMimeContentType(Content: Pointer; Len: integer;
const FileName: TFileName=''): RawUTF8;
begin // see http://www.garykessler.net/library/file_sigs.html for magic numbers
result := '';
if (Content<>nil) and (Len>4) then
case PCardinal(Content)^ of
$04034B50: Result := 'application/zip'; // 50 4B 03 04
$46445025: Result := 'application/pdf'; // 25 50 44 46 2D 31 2E
$21726152: Result := 'application/x-rar-compressed'; // 52 61 72 21 1A 07 00
$AFBC7A37: Result := 'application/x-7z-compressed'; // 37 7A BC AF 27 1C
$75B22630: Result := 'audio/x-ms-wma'; // 30 26 B2 75 8E 66
$9AC6CDD7: Result := 'video/x-ms-wmv'; // D7 CD C6 9A 00 00
$474E5089: Result := 'image/png'; // 89 50 4E 47 0D 0A 1A 0A
$38464947: Result := 'image/gif'; // 47 49 46 38
$002A4949, $2A004D4D, $2B004D4D:
Result := 'image/tiff'; // 49 49 2A 00 or 4D 4D 00 2A or 4D 4D 00 2B
$E011CFD0: // Microsoft Office applications D0 CF 11 E0 = DOCFILE
if Len>600 then
case PWordArray(Content)^[256] of // at offset 512
$A5EC: Result := 'application/msword'; // EC A5 C1 00
$FFFD: // FD FF FF
case PByteArray(Content)^[516] of
$0E,$1C,$43: Result := 'application/vnd.ms-powerpoint';
$10,$1F,$20,$22,$23,$28,$29: Result := 'application/vnd.ms-excel';
end;
end;
else
case PCardinal(Content)^ and $00ffffff of
$685A42: Result := 'application/bzip2'; // 42 5A 68
$088B1F: Result := 'application/gzip'; // 1F 8B 08
$492049: Result := 'image/tiff'; // 49 20 49
$FFD8FF: Result := 'image/jpeg'; // FF D8 FF DB/E0/E1/E2/E3/E8
else
case PWord(Content)^ of
$4D42: Result := 'image/bmp'; // 42 4D
end;
end;
end;
if (Result='') and (FileName<>'') then begin
case GetFileNameExtIndex(FileName,'png,gif,tiff,tif,jpg,jpeg,bmp,doc,docx') of
0: Result := 'image/png';
1: Result := 'image/gif';
2,3: Result := 'image/tiff';
4,5: Result := 'image/jpeg';
6: Result := 'image/bmp';
7,8: Result := 'application/msword';
else begin
Result := RawUTF8(ExtractFileExt(FileName));
if Result<>'' then begin
Result[1] := '/';
Result := 'application'+LowerCase(Result);
end;
end;
end;
end;
if Result='' then
Result := 'application/octet-stream';
end;
您可以使用 GAry Kessler 列表中的类似功能。
有许多具有数百(如果不是数千)版本和格式的数据库引擎。(二进制、CSV、XML...)其中许多都经过加密以保护内容。识别每个数据库和每种格式是非常“不可能”的,而且它是不断变化的主题。
因此,首先您必须将任务限制在要扫描的数据库引擎列表中。这就是我会做的...
首先,我不相信您可以在“快速扫描”中做更多的事情,而不是提供“可能的格式”。此外,很难想象任何快速的技术都是可靠的。
DBASE 文件通常使用扩展名 .dbf。FoxPro 和 Clipper 使用的 dBase 文件格式有多种变体。维基百科将这些记录为xBase。任何可以打开 dBase 文件的 dBase 库也可能能够 (a) 通过打开它来表明这实际上是一个真正的 dBase 文件,并且 (b) 允许您查看哪些受支持的 xBase 文件格式变体正在使用中.
访问文件通常使用 .mdb 文件格式,但可以使用密码进行加密。您可能可以编写自己的库,该库可以将内部内容识别为“Jet 数据库引擎”(Access 使用的内部文件类型)但不读取内容,但我怀疑如果没有破解密码,您可以可靠地做到这一点。
FileMaker 文件可以有许多文件扩展名,并且它们的内部文件格式没有很好的文档记录。根据维基百科,.fm .fp3 .fp5 和 .fp7 是常见的文件扩展名。与 Access 一样,您将在使用 filemaker 数据库时遇到类似的“密码”问题。除了通过 ODBC 之外,我不知道有任何方法可以在 delphi 中读取文件生成器文件,即便如此,我认为您无法在 Delphi 中提供由 ODBC 提供支持的“全能阅读器”,因为 ODBC 需要仔细设置和知识在原始文件通过 ODBC 变得可读之前,将其转换为 odbc 数据源。浏览/发现不是 ODBC 支持的阶段。
SQLite 文件可以有任何文件扩展名。尝试检测它的最简单方法是使用 SQLite 加载/打开文件并查看它是否打开。
列表的其余部分或多或少是无限的,技术也是一样的。只需将更多的数据库引擎和访问层库添加到您的 Katamari Damaci 数据库检测器工具中即可。
如果您想从看起来像的旧数据库格式开始,我会研究使用 BDE(古老的,但是嘿,您说的是古老的东西)加上 ADO,以尝试自动检测和打开文件。