Как узнать, в каком формате базы данных был создан файл (или набор файлов) (в Delphi)? - PullRequest
8 голосов
/ 04 июня 2011

У меня есть несколько файлов данных, созданных многими различными программами.Есть ли способ определить базу данных и версию базы данных, которая использовалась для создания файла данных.

Например, я хотел бы определить, какие файлы создаются из Microsoft Access, dBASE, FileMaker, FoxPro, SQLite или др.

Я просто хочу как-то быстро отсканировать файлы и отобразить информацию о них, включая исходную базу данных и версию.

Для справки я использую Delphi 2009.

Ответы [ 3 ]

8 голосов
/ 04 июня 2011

Прежде всего, проверьте расширение файла. Взгляните на соответствующую статью в Википедии или другие сайты.

Тогда вы можете угадать формат файла по его так называемой "подписи".

Это в основном контент из первых символов, который может идентифицировать формат файла.

У вас есть обновленный список на этом очень хорошем сайте Гэри Кесслера.

Например, вот , как наша платформа идентифицирует формат 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;

Вы можете использовать аналогичную функцию из списка Гари Кесслера.

2 голосов
/ 04 июня 2011

Во-первых, я не верю, что вы могли бы сделать больше в «быстром сканировании», чем в «возможном формате». Кроме того, очень трудно представить, что любая быстрая техника может быть надежной.

Файлы DBASE обычно используют расширение .dbf. Существуют варианты формата файлов dBase, используемые FoxPro и Clipper. Википедия документирует их как xBase . Любая библиотека dBase, которая может открывать файлы dBase, также, вероятно, сможет (а) показать, что на самом деле это настоящий файл dBase, открыв его, и (b) позволит вам увидеть, какие поддерживаемые варианты формата файла xBase используются .

Файлы доступа обычно используют формат файла .mdb, но могут быть зашифрованы паролем. Возможно, вы могли бы написать свою собственную библиотеку, которая могла бы положительно идентифицировать внутреннее содержимое как «ядро базы данных Jet» (внутренний тип файла, используемый Access), но не считывать содержимое, но я сомневаюсь, что если не взломать пароль, вы могли бы сделать это надежно.

Файлы FileMaker могут иметь множество расширений, а их внутренние форматы файлов недостаточно хорошо документированы. Согласно википедии, .fm .fp3 .fp5 и .fp7 являются распространенными расширениями файлов. У вас будут такие же проблемы с паролем в базах файловых файлов, как и в Access. Я не знаю какого-либо способа чтения файловых файлов в Delphi, кроме как через ODBC, и даже тогда я не думаю, что вы могли бы предоставить «omni-reader» в Delphi, работающий на ODBC, поскольку ODBC требует тщательной настройки и знаний исходного файла в источник данных odbc, прежде чем он станет доступным для чтения через ODBC. Просмотр / обнаружение - это не фаза, поддерживаемая ODBC.

Файлы SQLite могут иметь любое расширение. Самый простой способ обнаружить это - загрузить / открыть файл с помощью SQLite и посмотреть, открывается ли он.

Остальная часть списка более или менее бесконечна, и техника будет такой же. Просто продолжайте внедрять больше механизмов баз данных и доступа к библиотекам слоев в свой инструмент Katamari Damaci Database Detector Tool.

Если вы хотите начать со старых форматов баз данных, как вам кажется, я бы исследовал использование BDE (древний, но эй, вы говорите о древних вещах) плюс ADO, чтобы попытаться автоматически обнаруживать и открывать файлы .

2 голосов
/ 04 июня 2011

Существует множество механизмов баз данных с сотнями (если не тысячами) версий и форматов. (Binary, CSV, XML ...) Многие из них зашифрованы для защиты содержимого. Совершенно «невозможно» идентифицировать каждую базу данных и каждый формат, и это предмет постоянных изменений.

Итак, в первую очередь вы должны ограничить свою задачу списком ядер баз данных, которые вы хотите сканировать. Вот что я бы сделал ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...