En enkel klasse for å få informasjon om disken strukturen i en Interbase /Firebird database enkel klasse vil tillate deg å spesifisere en Interbase /Firebird database og det vil retrive informasjon om databasen includingSecondary filesPage sizesOn disk struktur numberNumber av sider for hver fileetcTo bruke det kan du bare gjøre thisGDBInfo: = TGDBInfo.Create ('c: \\ something.gdb'); prøve for jeg: = 0 til GDBInfo.Count - en gjøre ShowMessage (GDBInfo [I]. filnavn), og endelig GDBInfo.Free; ende; enhet GDBInfo; interfaceuses SysUtils, klasser; konst cMAX_PAGE_SIZE = 32768; skriver Schär = Shortint; SShort = SMALLINT; UShort = Word; Slong = Longint; ULONG = Long; TPag = pakket posten pag_type: Schär; pag_flags: Schär; pag_checksum: UShort; pag_generation: ULONG; pag_seqno: ULONG; pg_offset: ULONG; slutt; THdr = pakket posten hdr_header: TPag; hdr_page_size: UShort; hdr_ods_version: UShort; hdr_pages: slong; hdr_next_page: ULONG; hdr_oldest_transaction: slong; hdr_oldest_active: slong; hdr_next_transaction: slong; hdr_sequence: UShort; hdr_flags: UShort; hdr_creation_date: array [0..1] av slong; hdr_attachment_id: slong; hdr_shadow_count: slong; hdr_implementation: SShort; hdr_ods_minor: UShort; hdr_ods_minor_original: UShort; hdr_end: UShort; hdr_page_buffers: ULONG; hdr_bumped_transaction: slong; hdr_oldest_snapshot: slong; hdr_misc: array [0..3] av slong; slutt; THdrPage = pakket rekord fix_data: THdr; var_data: array [0..cMAX_PAGE_SIZE - 1 - sizeof (THdr)] av Byte; slutt; //Ikke IB relatert EGDBError = klasse (Unntak); PGDBFile = ^ TGDBFileInfo; TGDBFileInfo = rekord Header: THdr; Filnavn: ShortString; ContinuationFile: ShortString; FirstLogicalPage: Long; LastLogicalPage: Long; TotalPages: Long; slutt; TGDBInfo = klasse privat FList: tListe; FFilename: string; prosedyre GetDBFiles; funksjon GetItem (I: Integer): TGDBFileInfo; beskyttet offentlig konstruktør Opprette (konst AFilename: string); destructor Destroy; styre; funksjon Count: Integer; eiendoms Elementer [I: Integer]: TGDBFileInfo lese GetItem; misligholde; enden, implementering {TGDBInfo} funksjon TGDBInfo.Count: Integer; begynne Resultat: = FList.Count; ende; konstruktør TGDBInfo.Create (konst AFilename: string); begynner arvet Opprett; FList: = TList.Create; FFilename: = AFilename; GetDBFiles; end; destructor TGDBInfo.Destroy; Var jeg: Integer; begynne for jeg: = Count - 1 downto 0 do begynne FreeMem (FList [I]); FList.Delete (I); slutt; arvet; end; prosedyre TGDBInfo.GetDBFiles; Var FS: TFileStream; HeaderPage: THdrPage; Newfile: PGDBFile; CurrentFilename: ShortString; FilenameSize: Byte; Startside: Long; SourceDir: string; DataOffset: Integer; begynne om ikke FileExists (FFilename) deretter heve EGDBError.Create ('Filen eksisterer ikke -' + FFilename); SourceDir: = ExtractFilePath (FFilename); hvis SourceDir = '' da SourceDir: = IncludeTrailingBackSlash (GetCurrentDir); Startside: = 0; CurrentFilename: = SourceDir + ExtractFilename (FFilename); gjenta FS: = TFileStream.Create (CurrentFilename, fmOpenRead eller fmShareDenyNone); prøv GetMem (newfile, sizeof (TGDBFileInfo)); FS.Read (HeaderPage, sizeof (HeaderPage)); Flytt (HeaderPage, NewFile.Header, sizeof (THdr)); DataOffset: = 0; //Format av var_data gjentas //1 = Root filnavn //2 = Journal server //3 = Videreføring fil (dette er den vi vil) //4 = Siste logiske siden //5 = Unlicensed aksesser //6 = Sweep intervall //7 = Replay logging fil //11 = Delt cache fil mens HeaderPage.var_data [DataOffset] < > 3 gjør begynne hvis HeaderPage.var_data [DataOffset + 1] = 0, så Break; Inc (DataOffset, HeaderPage.var_data [DataOffset + 1] + 2); hvis DataOffset > HeaderPage.fix_data.hdr_page_size - sizeof (HeaderPage.fix_data) deretter heve EGDBError.Create ('Videreføring'); slutt; FilenameSize: = HeaderPage.var_data [DataOffset + 1]; NewFile.Filename: = CurrentFileName; SetLength (NewFile.ContinuationFile, FilenameSize); hvis FilenameSize > 0 deretter Flytt (HeaderPage.var_data [DataOffset + 2], NewFile.ContinuationFile [1], FilenameSize); NewFile.FirstLogicalPage: = startside; Move (HeaderPage.var_data [DataOffset + FilenameSize + 4], NewFile.LastLogicalPage, sizeof (Long)); NewFile.TotalPages: = NewFile.LastLogicalPage - NewFile.FirstLogicalPage; Inc (startside, NewFile.TotalPages); FList.Add (newfile); CurrentFilename: = NewFile.ContinuationFile; hvis CurrentFilename = '' da begynne NewFile.LastLogicalPage: = 0; NewFile.TotalPages: = 0; Gå i stykker; slutt; endelig FS.Free; slutt; inntil False; ende; funksjon TGDBInfo.GetItem (I: Integer): TGDBFileInfo; begynne Resultat: = PGDBFile (FList [I]) ^; ende; end
.
Header filformat for Interbase /Firebird files
Previous:Day of year
Next Page:? Nettverkstilkobling til stede