2011-06-04 17 views
6

Tengo una serie de archivos de datos creados por muchos programas diferentes. ¿Hay alguna manera de determinar la base de datos y la versión de la base de datos que se utilizó para crear el archivo de datos?¿Cómo puedo saber con qué formato de base de datos se creó un archivo (o conjunto de archivos) (en Delphi)?

Por ejemplo, me gustaría identificar los archivos que se crean a partir de Microsoft Access, dBASE, FileMaker, FoxPro, SQLite u otros.

Realmente sólo quiero escanear algún modo rápidamente los archivos y mostrar información sobre ellos, incluyendo la base de datos de origen y versión.

Como referencia, estoy usando Delphi 2009.

+2

Seguramente conoce las extensiones de archivo. En segundo lugar, seguramente es consciente de que quizás muchos programas NO utilicen ningún formato de archivo de base de datos, y que la cantidad de formatos de archivos binarios privados en el mundo sea para todos los efectos, incontable. –

+0

@Warren: estoy buscando específicamente en el software de genealogía. Tienden a utilizar controladores de base de datos dentro de sus programas, pero guardan sus datos en el disco como archivos de proyecto con sus propias extensiones propietarias. Yo, por ejemplo, usaré DISQLite3 y guardaré mi archivo .bhp en formato SQLite. – lkessler

+0

Pero es de esperar que los archivos de base de datos "renombrados" a menudo no estén en su formato "nativo". Creo que a menudo están encapsulados en una estructura más grande ("contenedor") con alguna otra información (no DB) y tal vez compresión. Al menos lo hago con mis proyectos. – Andreas

Respuesta

6

Antes que nada, verifique la extensión del archivo. Eche un vistazo al corresponding wikipedia article, u otros sitios.

A continuación, puede adivinar el formato de archivo de su llamada "firma".

Este es principalmente el primer contenido de caracteres, que es capaz de identificar el formato de archivo.

Tiene una lista actualizada en este sitio web very nice Gary Kessler's.

Por ejemplo, aquí es how our framework identify the MIME format from the file content, en el lado del servidor:

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; 

Se puede utilizar una función similar, de la lista del Gary Kessler.

+0

¡Perfecto! Eso es exactamente lo que quería saber. Y la página de Gary Kessler (sin relación) es una gran referencia. – lkessler

+0

¡Qué apellido ... :) –

2

Hay un montón de motores de bases de datos con cientos (si no miles) de versiones y formatos. (Binario, CSV, XML ...) Muchos de ellos están encriptados para proteger el contenido. Es bastante "imposible" identificar cada base de datos y cada formato y es un tema de cambios constantes.

Así que en primer lugar se tiene que limitar su tarea a una lista de motores de bases de datos que desea analizar. Eso es lo que yo haría ...

+0

Bien. ¿Qué tal si empiezo con la lista que di? ¿Cuál es la mejor manera de identificarlos? Si hay otros que son de uso común y fáciles de identificar, entonces puedo agregarlos. Tal vez hay un componente Delphi en alguna parte que ya hace esto? – lkessler

+0

Tengo serias dudas de que haya una herramienta que identifique "CUALQUIER ARCHIVO DE BASES DE DATOS". No hay rasgos comunes que podría utilizar, tendría que combinar todas las bibliotecas de acceso a bases de datos posibles en una mega biblioteca para estar seguro. ¿Y qué propones que haga tu herramienta cuando un archivo es de un tipo particular pero está dañado? Su pregunta no está bien definida, o realmente, en última instancia, responde. –

2

En primer lugar, no creo que podría hacer más en un "análisis rápido" que proporcionan un "formato posible". Además, es muy difícil imaginar que cualquier técnica rápida pueda ser confiable.

Los archivos DBASE utilizan comúnmente la extensión .dbf. Existen variantes del formato de archivo dBase utilizado por FoxPro y Clipper. Wikipedia los documenta como xBase. Cualquier biblioteca de dBase que pueda abrir archivos dBase probablemente también sea capaz de (a) mostrar que este es, de hecho, un verdadero archivo dBase abriéndolo, y (b) permitirle ver qué variantes soportadas del formato de archivo xBase están en uso. .

archivos de acceso son por lo general utilizando el formato de archivo .mdb, pero se pueden cifrar con una contraseña. Probablemente puedas escribir tu propia biblioteca que pueda identificar postiáticamente el contenido interno como "motor de la base de datos Jet" (tipo de archivo interno utilizado por Access) pero no leer el contenido, pero dudo que a menos que se rompa la contraseña, podrías haz esto de manera confiable

archivos de FileMaker pueden tener muchas extensiones de archivo, y sus formatos de archivos internos no están bien documentados. Según wikipedia, .fm .fp3 .fp5 y .fp7 son extensiones de archivo comunes. Tendrá problemas de "contraseña" similares con las bases de datos de filemaker, como con Access. No conozco ninguna forma de leer archivos filemaker en Delphi excepto a través de ODBC, y aun así, no creo que pueda proporcionar un "omni-reader" en Delphi que funciona con ODBC, ya que ODBC requiere una configuración y conocimiento cuidadosos. del archivo de origen en una fuente de datos odbc antes de que sea legible a través de ODBC. Explorar/Descubrir no es una fase admitida por ODBC.

Los archivos SQLite pueden tener cualquier extensión de archivo. La forma más fácil de tratar de detectarlo sería cargar/abrir el archivo usando SQLite y ver si se abre.

El resto de la lista es más o menos infinita, y la técnica sería la misma. Simplemente continúe desplegando más motores de base de datos y acceda a las bibliotecas de capa en su herramienta de detección de base de datos Katamari Damaci.

Si quieres comenzar con formatos de bases de datos viejos como pareces, investigaría usando BDE (antiguo, pero oye, estás hablando de cosas antiguas), además de ADO, para tratar de autodetectar y abrir archivos.

Cuestiones relacionadas