zoukankan      html  css  js  c++  java
  • WinAPI: CopyFileEx


    function CopyFileEx(
      lpExistingFileName: PWideChar;         { 源文件 }
      lpNewFileName: PWideChar;              { 新的目标文件 }
      lpProgressRoutine: TFNProgressRoutine; { 回调函数; 每复制 64K 调用一次 }
      lpData: Pointer;                       { 给回调函数的参数 }
      pbCancel: PBool;                       { 是个布尔值指针; True 是取消复制 }
      dwCopyFlags: DWORD                     { 复制选项; 下面有补充... }
    ): BOOL; stdcall;                        { 返回成功或失败 }
    
    //dwCopyFlags(复制选项):
    COPY_FILE_FAIL_IF_EXISTS = $00000001; { 如果目标存在则失败返回 }
    COPY_FILE_RESTARTABLE    = $00000002; { 若失败则重新开始 }
    
    //CopyFileEx 使用的回调函数: function ProgressRoutine( 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; { 返回值; 下面有补充... } //dwCallbackReason(回调函数的状态): CALLBACK_CHUNK_FINISHED = $00000000; { 复制进行中 } CALLBACK_STREAM_SWITCH = $00000001; { 准备开始} //回调函数可以使用的返回值: PROGRESS_CONTINUE = 0; { 继续 } PROGRESS_CANCEL = 1; { 取消 } PROGRESS_STOP = 2; { 暂停 } PROGRESS_QUIET = 3; { 终止回调, 但不停止复制 }

    一个实现复制进度的测试, 测试前在窗体上放个 TProgressBar:

    //回调函数; 为了运算我把其中的 LARGE_INTEGER 类型改成 Int64 了
    function ProgressRoutine(TotalFileSize, TotalBytesTransferred, StreamSize,
      StreamBytesTransferred: Int64; dwStreamNumber, dwCallbackReason: DWORD;
      hSourceFile, hDestinationFile: THANDLE; lpData: Pointer): DWORD; stdcall;
    begin
      Form1.ProgressBar1.Position := Trunc(TotalBytesTransferred / TotalFileSize * 100);
      Application.ProcessMessages;
      Result := PROGRESS_CONTINUE;
    end;
    
    //复制
    procedure TForm1.Button1Click(Sender: TObject);
    const
      s = 'C:\Temp\Test.rar';
      d = 'C:\Temp\NewDir\Test.rar';
    begin
      Assert(FileExists(s), '源文件不存在');
      Assert(DirectoryExists(ExtractFilePath(d)), '目标路径不存在');
      CopyFileEx(PChar(s), PChar(d), @ProgressRoutine, nil, nil, COPY_FILE_RESTARTABLE);
    end;
    
  • 相关阅读:
    如何只用5分钟完成数据 列表、创建页面
    从零开始搭建一个PaaS平台
    C# 多线程猜想
    使用Golang + lua实现一个值班机器人
    如何使用Golang实现一个API网关
    记一次Windb死锁排查
    怎样在PaaS平台上搭建一个会自动关闭的会议室
    JS Object To C# ASP.Net ModelBind
    重写了一遍授权思路
    授权详细设计
  • 原文地址:https://www.cnblogs.com/del/p/1642632.html
Copyright © 2011-2022 走看看