На главную
ПРАВИЛА FAQ Помощь Участники Календарь Избранное DigiMania RSS
msm.ru
Модераторы: Rouse_, jack128, Krid
  
    > Как определить что файл является DBF
      Я думаю что у многих кто работал когда либо с базами данных DBF, возникала иногда при импорте или вдругих случаях необходимость определения а является или выбранный файл правильной версией DBF или нет?

      Я предлагаю определить это двумя способами:

      ПЕРВЫЙ способ: Определение DBF таблици по расширению ( *.DBF ) и по первому байту заголовка да и файла в целом (по флагу версии DBF).
      Спецификацию флагов я брал тут: http://www.clicketyclick.dk/databases/xbase/format/dbf.html#DBF_NOTE_1_TARGET
      и дополнял теми что были описаны тут: http://www.foxclub.ru/rhproject/project/html/465e7a94-51b7-4e0c-98f9-432864fe5bcc.htm

      ExpandedWrap disabled
        function IsDBF(FileName: string): boolean;
        var
         f: file;
         b: byte;
        begin
         AssignFile(f, FileName);
         FileMode := fmOpenRead and fmShareDenyNone;
         Reset(f, 1);
         try
          BlockRead(f, b, 1);
         finally
          CloseFile(f);
         end;
          if
        //******************************************************************************
        // Value    *                        Description
        //******************************************************************************
         (b = $02) or //FoxBASE
         (b = $03) or //File without DBT - FoxBASE+/Dbase III plus, no memo
         (b = $04) or //dBASE IV w/o memo file
         (b = $05) or //dBASE V w/o memo file
         (b = $30) or //Visual FoxPro
         (b = $30) or //Visual FoxPro with DBC
         (b = $31) or //Visual FoxPro with AutoIncrement field
         (b = $43) or //.dbv memo var size (Flagship) - dBASE IV SQL table files, no memo
         (b = $63) or //dBASE IV SQL system files, no memo //!!!
         (b = $7B) or //dBASE IV with memo
         (b = $83) or //File with DBT - FoxBASE+/dBASE III PLUS, with memo
         (b = $83) or //dBASE III+ with memo file
         (b = $8B) or //dBASE IV with memo
         (b = $8E) or //dBASE IV with SQL table
         (b = $B3) or //.dbv and .dbt memo (Flagship)
         (b = $E5) or //Clipper SIX driver w. SMT memo file. NOTE!!! Clipper SIX driver sets lowest 3 bytes to 110 in descriptor of crypted databases. So, 3->6, 83h->86h, F5->F6, E5->E6 etc.
         (b = $CB) or //dBASE IV SQL table files, with memo //!!!
         (b = $F5) or //FoxPro 2.x (or earlier) with memo file
         (b = $FB)    //FoxBASE ???
        //******************************************************************************
         then Result := True else Result := False;
        end;

      Способ вызова (применение).
      ExpandedWrap disabled
        procedure TForm1.Button1Click(Sender: TObject);
        begin
          if not OpenDialog1.Execute then Exit else
          if IsDBF(OpenDialog1.FileName) = True then
          ShowMessage('YES!!! This is DBF file!') else
          ShowMessage('NO! This is not DBF file!')
        end;

      ВТОРОЙ способ: Описываем структуру DBF файла и выведим формулу.
      Размер файла = [количеством записей в dbf] * [длину записи] + [длина заголовока] + 1

      А выглядит всё это так:
      ExpandedWrap disabled
        ...
        type
          TDBFHeader = packed record //структура первых 32-х байтов заголовка
          TableType: Byte; //тип таблицы
          Year: Byte;   //год
          Month: Byte;  //месяц
          Day: Byte;    //день
          RecordsCount: Cardinal; //количество записей в таблице
          HeaderSize: Word; //размер заголовка в байтах
          RecordSize: Word; //размер записи в байтах
          ReservedOne: Word; //зарезервировано #1
          Transaction: Byte; //транзакция
          Encripted: Byte; //кодирование
          MultyUserEnvironment: array[1..12] of Byte; //многопользовательская среда
          Indexed: Byte; //индексированная таблица
          LanguageDriver: Byte; //языковой драйвер
          ReservedTwo: Word; //зарезервировано #2
        end;
         
        ...
         
        function IsDBF2(FileName: string): Boolean;
        var
         DBFHeader: TDBFHeader;
         f: file;
         Size: Longint;
        begin
         AssignFile(f, FileName);
         Reset(f, 1);
         try
          BlockRead(f, DBFHeader, SizeOf(DBFHeader));
          with DBFHeader do
        //размер файла = (количеством записей)*(длину записи) + длина заголовока + 1
          Size := RecordsCount * RecordSize + HeaderSize + 1;
          if Size = FileSize(f) then Result:=True else Result:=False;
         finally
          CloseFile(f);
         end;
        end;

      Способ вызова (применение).
      ExpandedWrap disabled
        procedure TForm1.Button1Click(Sender: TObject);
        begin
          if not OpenDialog1.Execute then Exit else
          if IsDBF2(OpenDialog1.FileName) = True then
          ShowMessage('YES!!! This is DBF file!') else
          ShowMessage('NO! This is not DBF file!')
        end;

      При написании функций я использовал материалы с этих источников:
      1) Xbase ( & dBASE ) File Format Description
      2) Структура табличного файла (.dbc, .dbf, .frx, .lbx, .mnx, .pjx, .scx, .vcx)
      3) Структура DBF-файлов для непродвинутых
      Сообщение отредактировано: User32 -
      Незнание некоторых фактов сполна компенсируется знанием некоторых принципов...
      1 пользователей читают эту тему (1 гостей и 0 скрытых пользователей)
      0 пользователей:


      Рейтинг@Mail.ru
      [ Script Execution time: 0,0622 ]   [ 15 queries used ]   [ Generated: 23.10.17, 19:06 GMT ]