全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1522
推到 Plurk!
推到 Facebook!

自動遞增編號的 Paradox Table 備份

 
Justmade
版主


發表:94
回覆:1934
積分:2030
註冊:2003-03-12

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-03-22 22:10:27 IP:61.10.xxx.xxx 未訂閱
這個程序是備份 Paradox Table 所用,所有 Memo, index, 預設值, Referencial Integrity 等等全部會一起備份。    備份的檔名會自動遞增編號,例如 MyTable.* 第一次備份會備份為 MyTable001.*,第二次會備份為 MyTable002.*, 如此類推。    程序需要 2 個變數    第一個是 TTable ,就是你要備份的 Table,程序會自動找檔案所在及需要一起備份的相關檔案。    第二個(可選)是目的地,若不傳入,則預設是來源 Table 的同一檔案夾。    回傳值是成功與否,任一檔案不能備份均會回傳失敗。    提醒一點,由於程序會試行設定 Exclusive = True,若有人在使用(包括 Delphi IDE)會引起 Exception,程序中特意沒處理這個 Exception 讓你可處理這個來通知使用者有人在用Table備份不安全。所以若你用 Delphi 來 Run 不要預設該 Table Active 為 True。    若是你不想設 Exclusive = True 可自行刪掉, 若抄檔中途剛好有人更新的話備份檔便會 Index out of date。    最後,若你把這個程序放在別的 Unit 記得該 Unit 要 Use DBTables。    使用實例    
procedure TForm1.Button1Click(Sender: TObject);
begin
  if ParadoxBackupTable(Table1) then // 不提供目的地,即用原始檔案夾
    ShowMessage('備份成功')
  else
    ShowMessage('備份失敗');
end;
* 若你在Delphi Run 而 Table1.Active 設成 True,會出現訊息說 Table busy 及 username : 你的 username。 程序 :
function ParadoxBackupTable(DS : TTable; DestPath : String='') : Boolean;
var
  FHand : THandle;
  FDir, FName : String;
  FNum : Integer;
  FD: TWin32FindData;
begin
  result := false;
  DS.DisableControls;
  DS.Active := false;
  DS.Exclusive := true; 
  DS.Active := true;
  FDir := DS.Database.Directory;
  if DestPath = '' then DestPath := FDir;
  FName :=  copy(DS.TableName,1,Length(DS.TableName)-3);
  FNum := 1;
  If not FileExists(FDir   FName   '.db') then
    exit;
  While FileExists(Format('%s%3.3d%s',[FDir   FName,FNum,'.db'])) do // 找最小的可用序號
    FNum := FNum   1;
  FHand := windows.FindFirstFile(PChar(FDir   FName   '.*'),FD);
  if FHand = INVALID_HANDLE_VALUE then
    exit;
  result := true;
  repeat
    if not LongBool(FD.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) then //不處理資料夾
    begin
      result := result and CopyFile(PChar(FDir   FD.cFileName),PChar(Format('%s%3.3d%s',
                [DestPath   FName,FNum,ExtractFileExt(FD.cFileName)])),True);
    end;
  until not windows.FindNextFile( FHand, FD );
  Windows.FindClose( FHand );
  DS.Active := false;
  DS.EnableControls;
end;
chih
版主


發表:48
回覆:1186
積分:639
註冊:2002-04-02

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-04-19 10:52:03 IP:61.217.xxx.xxx 未訂閱
發現一各問題,這一句 FDir := DS.Database.Directory; 應該改成這樣 FDir := DS.Database.Directory '\';
系統時間:2024-05-16 0:30:06
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!