我们知道,一般的dbf文件执行delete操作都只是对文件进行逻辑删除(对记录做标记,可以恢复),而怎么使记录彻底删除呢?
如下:
procedure PackTable(Table: TTable);
var
Props: CURProps;
begin
// 必须以独占方式打开
if (not Table.Active) or (not Table.Exclusive) then Exit;
Check(DBIGetCursorProps(Table.Handle, Props));
// 必须是dBase或FoxPro
if Props.szTableType <> szDBASE then Exit;
Check(DBIPackTable(Table.DBHandle, Table.Handle, nil, szDBASE, True));
Table.Open;
end;
procedure BatchPackTable(const sCurrentPath: string); //dbf文件目录
var
SearchRec: TSearchRec;
iFindResult:integer;
tblBeUndelete: TTable;
begin
iFindResult := FindFirst (sCurrentPath + '*.dbf', faAnyFile, SearchRec);
while iFindResult = 0 do
begin
Application.ProcessMessages;
tblBeUndelete :=TTable.Create(W_POS_MainWindow);
Application.ProcessMessages;
with tblBeUndelete do
begin
DatabaseName := sCurrentPath;
TableName := SearchRec.Name;
TableType := ttDBase;
Exclusive := True;
Open;
Application.ProcessMessages;
PackTable(tblBeUndelete);
Application.ProcessMessages;
Close;
Free;
end;
Application.ProcessMessages;
iFindResult := FindNext (SearchRec);
end;
(* 向下搜寻子目录 *)
iFindResult := FindFirst(sCurrentPath + '*.', faDirectory, SearchRec);
while iFindResult = 0 do
begin
Application.ProcessMessages;
if (SearchRec.Name[1] <> '.') then
begin
BatchPackTable(sCurrentPath + SearchRec.Name + '\');
end;
iFindResult := FindNext(SearchRec);
end;
end;
如果需要对dbf文件进行物理删除,只需要调用BatchPackTable方法。