API函數CopyFileEx使用詳解(delphi)

來源:互聯網
上載者:User

{ 函數原型 }
 
  function CopyFileEx(
    lpExistingFileName   : PChar;               // 來源檔案
    lpNewFileName        : PChar;               // 目標檔案
    lpProgressRoutine    : TFNProgressRoutine;  // 用於返迴文件有關資訊的回呼函數
    lpData               : Pointer;             // 傳遞給回呼函數的參數
    pbCancel             : PBool;               // 用於中途取消拷貝,函數會監視此值的狀態,如果為真,則停止拷貝
    dwCopyFlags          : DWORD                // 選項標誌,見定義
    ): BOOL; stdcall;                           // 返回拷貝成功還是失敗
 
 
 
{ CopyFileEx 回呼函數可能的傳回值 }
 
  PROGRESS_CONTINUE = 0;                        // 讓拷貝過程繼續
  PROGRESS_CANCEL = 1;                          // 終止拷貝過程並刪除目標檔案
  PROGRESS_STOP = 2;                            // 停止拷貝,但以後可以繼續開始
  PROGRESS_QUIET = 3;                           // 讓拷貝過程繼續,但從此不再進行回調
 
 
 
{ CopyFileEx 回呼函數狀態 }
 
  CALLBACK_STREAM_SWITCH = $00000001;           // 第一次回調的狀態是 CALLBACK_STREAM_SWITCH
  CALLBACK_CHUNK_FINISHED = $00000000;          // 而後的狀態都是 CALLBACK_CHUNK_FINISHED
 
 
 
{ CopyFileEx 選項標誌 }
 
  COPY_FILE_FAIL_IF_EXISTS = $00000001;         //檔案存在則取消拷貝
  COPY_FILE_RESTARTABLE = $00000002;            //拷貝失敗可重新開始
 
 
 
{ 回呼函數原型 }
 
  TFarProc = Pointer;
  TFNProgressRoutine = TFarProc;                //指標類型
 
  function CopyProgress(
    TotalFileSize         : LARGE_INTEGER;      // 檔案總大小,位元組
    TotalBytesTransferred : LARGE_INTEGER;      // 已複製的檔案大小,位元組
    StreamSize            : LARGE_INTEGER;      // 當前流的總位元組數
    StreamBytesTransferred: LARGE_INTEGER;      // 當前流已拷貝的位元組數
    dwStreamNumber        : DWORD;              // 當前流序號
    dwCallbackReason      : DWORD;              // 回呼函數的狀態,見定義
    hSourceFile           : THANDLE;            // 來源檔案控制代碼
    hDestinationFile      : THANDLE;            // 目標檔案控制代碼
    lpData                : Pointer             // CopyFileEx 函數傳遞過來的參數
    ) : DWORD; stdcall;                         // 回呼函數的傳回值,見定義
 
 
 
{ 說明 }
 
    該函數複製一個已存在的檔案到一個新檔案。該函數保留了檔案的擴充屬性,OLE儲存格式和檔案屬性。檔案的安全屬性不複製到新檔案中去。
    如果目標檔案存在,且具有唯讀屬性,則函數執行失敗。
    該函數每複製 65536位元組(即64KB) 的內容後就調用一次回呼函數。
    第一次調用回呼函數時 dwCallbackReason(回呼函數的狀態) 的值為 CALLBACK_STREAM_SWITCH,此時不複製任何資料,只是告訴回呼函數,將要開始複製資料了。
    此函數是線程同步的,也就是說,在主視窗中調用此函數時,視窗將無法響應使用者的操作,直到檔案複製完畢為止。
    此函數無法複製鎖定的檔案,比如分頁檔 PageFile.sys。就像在資源管理員中複製 PageFile.sys 一樣,會提示檔案正被另一個程式使用,無法複製。此函數不會提示錯誤,只會返回邏輯值否,表示複製失敗。
 
 
 
{============================================================}
{  例子                                                      }
{============================================================}
 
unit Main;
 
interface
 
uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;
 
type
  TForm2 = class(TForm)
    Memo1: TMemo;
    Button1: TButton;
    Button2: TButton;
    procedure Button2Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;
 
var
  Form2             : TForm2;
  Cancel            : Boolean;
  iCount            : Integer;
 
implementation
 
{$R *.dfm}
 
function CopyProgress(
  TotalFileSize: LARGE_INTEGER;                   // 檔案總大小,位元組
  TotalBytesTransferred: LARGE_INTEGER;           // 已複製的檔案大小,位元組
  StreamSize: LARGE_INTEGER;                      // 當前流的總位元組數
  StreamBytesTransferred: LARGE_INTEGER;          // 當前流已拷貝的位元組數
  dwStreamNumber: DWORD;                          // 當前流序號
  dwCallbackReason: DWORD;                        // 回呼函數的狀態,見定義
  hSourceFile: THANDLE;                           // 來源檔案控制代碼
  hDestinationFile: THANDLE;                      // 目標檔案控制代碼
  lpData: Pointer                                 // CopyFileEx 函數傳遞過來的參數
  ): DWORD; stdcall;                              // 回呼函數的傳回值,見定義
begin
  // if iCount = 2 then begin
  //   Result := PROGRESS_STOP;
  //   Exit;
  // end;
  Application.ProcessMessages;
  Form2.Memo1.Clear;
  Form2.Memo1.Lines.Add(IntToStr(TotalFileSize.QuadPart));
  Form2.Memo1.Lines.Add(IntToStr(TotalBytesTransferred.QuadPart));
  Form2.Memo1.Lines.Add(IntToStr(StreamSize.QuadPart));
  Form2.Memo1.Lines.Add(IntToStr(StreamBytesTransferred.QuadPart));
  Form2.Memo1.Lines.Add(IntToStr(dwStreamNumber));
  Form2.Memo1.Lines.Add(IntToStr(Result));
  Inc(iCount);
end;
 
procedure TForm2.Button1Click(Sender: TObject);
var
  Src, Dest         : string;
begin
  iCount := 0;
  Cancel := False;
  Src := 'D:/Tools.rar';
  Dest := 'E:/Tools.rar';

  if not FileExists(Src) then begin
    Memo1.Text := '檔案 ' + Src + ' 不存在!';
    Exit;
  end;
 
  CopyFileEx(
    PChar(Src),
    PChar(Dest),
    @CopyProgress,
    nil,
    @Cancel,
    COPY_FILE_RESTARTABLE);
end;
 
procedure TForm2.Button2Click(Sender: TObject);
begin
  Cancel := True;
end;
 
end.
 

本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/stevenldj/archive/2007/11/08/1872842.aspx

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.