Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[3.236.86.184] |
|
Сообщ.
#1
,
|
|
|
Я думаю что у многих кто работал когда либо с базами данных 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 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; Способ вызова (применение). 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 А выглядит всё это так: ... 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; Способ вызова (применение). 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-файлов для непродвинутых |