Database 我怎样才能知道一个文件(或一组文件)是用什么数据库格式创建的(在Delphi中)?

Database 我怎样才能知道一个文件(或一组文件)是用什么数据库格式创建的(在Delphi中)?,database,delphi,file-structure,identify,Database,Delphi,File Structure,Identify,我有许多不同程序创建的数据文件。是否有方法确定用于创建数据文件的数据库和数据库版本 例如,我想确定哪些文件是从MicrosoftAccess、dBASE、FileMaker、FoxPro、SQLite或其他软件创建的 我真的只是想以某种方式快速扫描文件,并显示有关它们的信息,包括源数据库和版本 作为参考,我使用的是Delphi 2009。有很多数据库引擎,有数百种(如果不是数千种)版本和格式。(二进制、CSV、XML…)其中许多都经过加密以保护内容。识别每一个数据库和每一种格式是非常“不可能”的

我有许多不同程序创建的数据文件。是否有方法确定用于创建数据文件的数据库和数据库版本

例如,我想确定哪些文件是从MicrosoftAccess、dBASE、FileMaker、FoxPro、SQLite或其他软件创建的

我真的只是想以某种方式快速扫描文件,并显示有关它们的信息,包括源数据库和版本


作为参考,我使用的是Delphi 2009。

有很多数据库引擎,有数百种(如果不是数千种)版本和格式。(二进制、CSV、XML…)其中许多都经过加密以保护内容。识别每一个数据库和每一种格式是非常“不可能”的,而且它是一个不断变化的主题


因此,首先,您必须将任务限制为要扫描的数据库引擎列表。这就是我要做的…

首先,我不相信你能在“快速扫描”中做得比提供“可能的格式”更多。而且,很难想象任何快速技术都是可靠的

数据库文件通常使用扩展名.dbf。FoxPro和Clipper使用的dBase文件格式有多种变体。维基百科将这些记录为。任何可以打开dBase文件的dBase库也可能能够(a)通过打开它来显示这实际上是一个真正的dBase文件,并且(b)允许您查看正在使用哪些受支持的xBase文件格式变体

Access文件通常使用.mdb文件格式,但可以使用密码进行加密。您可能可以编写自己的库,将内部内容主动识别为“Jet数据库引擎”(Access使用的文件的内部类型),但不读取内容,但我怀疑,如果不破解密码,您就可以可靠地执行此操作

FileMaker文件可以有许多文件扩展名,并且它们的内部文件格式没有很好的文档记录。根据维基百科,.fm.fp3.fp5和.fp7是常见的文件扩展名。与Access一样,filemaker数据库也会出现类似的“密码”问题。我不知道在delphi中除了通过ODBC之外还有什么方法可以读取filemaker文件,即使这样,我也不认为您可以在delphi中提供一个由ODBC提供支持的“全向读取器”,因为ODBC需要仔细设置,并了解ODBC数据源中的原始文件,然后才能通过ODBC进行读取。ODBC不支持浏览/发现阶段

SQLite文件可以有任何文件扩展名。尝试检测它的最简单方法是使用SQLite加载/打开该文件,并查看它是否打开

列表的其余部分或多或少是无限的,技术也是一样的。只需将更多的数据库引擎和访问层库滚动到您的Katamari Damaci数据库检测器工具中即可


如果你想从旧的数据库格式开始,我会研究使用BDE(古老的,但你说的是古老的东西)加上ADO来尝试自动检测和打开文件。

首先,检查文件扩展名。请看一下,或其他网站

然后,您可以从所谓的“签名”中猜出文件格式

这主要是第一个字符的内容,它能够识别文件格式

您已在此网站上更新了列表

例如,在服务器端:

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;
函数GetMimeContentType(内容:指针;Len:整数; 常量文件名:TFileName='':RawUTF8; 开始//seehttp://www.garykessler.net/library/file_sigs.html 关于幻数 结果:=''; 如果(Contentnil)和(Len>4),则 案例PCardinal(内容)^共 $04034B50:结果:='application/zip';//50 4B 03 04 $46445025:结果:='application/pdf';//25 50 44 46 2D 31 2E $21726152:结果:='application/x-rar-compressed';//52 61 72 21 1A 07 00 $AFBC7A37:结果:='application/x-7z-compressed';//37 7A BC AF 27 1C $75B22630:结果:='audio/x-ms-wma';//30 26 B2 75 8E 66 $9AC6CDD7:结果:='video/x-ms-wmv';//D7 CD C6 9A 00 00 $474E5089:结果:='image/png';//89 50 4E 47 0D 0A 1A 0A $38464947:结果:='image/gif';//47 49 46 38 002A4949美元、2A004D美元、2B004D美元: 结果:='image/tiff';//49 49 2A 00或4D 4D 00 2A或4D 4D 00 2B $E011CFD0://Microsoft Office应用程序D0 CF 11 E0=DOCFILE 如果Len>600,则 案例PWordArray(内容)^[256]共//,偏移量512处 $A5EC:结果:='application/msword';//欧共体A5 C1 00 $FFFD://FD-FF 案例PByteArray(内容)^[516] $0E、$1C、$43:结果:='application/vnd.ms powerpoint'; $10、$1F、$20、$22、$23、$28、$29:结果:='application/vnd.ms excel'; 结束; 结束; 其他的 案例PCardinal(内容)^和$00ffffff $685A42:结果:='application/bzip2';//42 5A 68 $088B1F:结果:='application/gzip';//1F 8B 08 $492049:结果:='image/tiff';//49 20 49 $FFD8FF:结果:='image/jpeg';//FF D8 FF DB/E0/E1/E2/E3/E8 其他的 案例PWord(内容)^共 $4D42:结果:='image/bmp';//42 4D 结束; 结束; 结束; 如果(结果=“”)和(文件名“”),则开始 案例GetFileNameExidex(文件名为“png、gif、tiff、tif、jpg、jpeg、bmp、doc、docx”) 0:结果:='image/png'; 1:结果:='image/gif'; 2,3:结果:='image/tiff'; 4,5:结果:='image/jpeg'; 6:结果:='image/bmp'; 7,8:结果:='application/msword'; 否则开始 结果:=RawUTF8(ExtractFileExt(FileName)); 如果结果为“”,则开始 结果[1]:='/'; 结果:=“应用程序”+小写(结果); 结束; 结束; 结束; 结束; 如果结果='',则 结果:='应用程序/八位字节流'; 结束; 您可以使用GAry Kes中的类似函数