Ahoj,
mám poměrně starou aplikaci, která používá ještě DBase soubory. Vím, že to je trochu starší přístup, ale potřeboval bych ty soubory programově pročistit (skutečně smazat zrušené položky).
kdysi dávno jsem používal tuto rutinu (někde opsáno)
// Pack a Paradox or dBASE table
// The table must be opened execlusively before calling this function...
procedure PackTable(Table: TTable);
var
Props: CURProps;
hDb: hDBIDb;
TableDesc: CRTblDesc;
begin
// Make sure the table is open exclusively so we can get the db handle...
if Table.Active = False then
raise EDatabaseError.Create('Tabulka musí být otevřená');
if Table.Exclusive = False then
raise EDatabaseError.Create('Tabulka musí být používána exklusivně');
// Get the table properties to determine table type...
Check(DbiGetCursorProps(Table.Handle, Props));
// If the table is a Paradox table, you must call DbiDoRestructure...
if Props.szTableType = szPARADOX then
begin
// Blank out the structure...
FillChar(TableDesc, sizeof(TableDesc), 0);
// Get the database handle from the table's cursor handle...
Check(DbiGetObjFromObj(hDBIObj(Table.Handle), objDATABASE, hDBIObj(hDb)));
// Put the table name in the table descriptor...
StrPCopy(TableDesc.szTblName, Table.TableName);
// Put the table type in the table descriptor...
StrPCopy(TableDesc.szTblType, Props.szTableType);
// Set the Pack option in the table descriptor to TRUE...
TableDesc.bPack := True;
// Close the table so the restructure can complete...
Table.Close;
// Call DbiDoRestructure...
Check(DbiDoRestructure(hDb, 1, @TableDesc, nil, nil, nil, FALSE));
end
else
// If the table is a dBASE table, simply call DbiPackTable...
if Props.szTableType = szDBASE then
Try
Check(DbiPackTable(Table.DBHandle, Table.Handle, nil, szDBASE, TRUE))
Except
On E:Exception Do
Writeln(Format('Pri komprimaci tabulky "%s"(database "%s") doslo k chybe "%s"',[Table.TableName,Table.DatabaseName,E.Message]))
End
else
// Pack only works on PAradox or dBASE; nothing else...
raise EDatabaseError.Create('Tabulka musí být Paradox nebo dBASE ');
// Table.Open;
end;
Problém je v tom, že je to poměrně nespolehlivá rutina. Jednou tabulku pročistí, podruhé hází exception v části " Check(DbiPackTable(Table.DBHandle, Table.Handle, nil, szDBASE, TRUE))", kterou ani přes ten blok TryExcept neodchytím.
Nemáte něco lepšího, co by 100% fungovalo? Používám Delphi XE2. Když je nejhůře, tak zprovozním Borland Database Desktop, ale ten se moc nemá rád s Win10, takže je to trochu komplikované.
Díky