[API 函数] CopyFileEx - 复制档案

一般要处理复制档案使用 File.Copy 方法就可以达到需求,可是若在复制档案过程中要显示进度及取消复制,就需要使用 API 函数 CopyFileEx 来处理。下列范例程序使用 CoypFileEx 来进行复制档案,复制过程序会显示进度,按下「取消复制」钮可中断复制动作。

Imports  System.Runtime.InteropServices

Public   Class  Form1
    
Private  pbCancel  As  Int32

    
< DllImport( " kernel32.dll " , CharSet: = CharSet.Auto) >  _
    
Private   Shared   Function  CopyFileEx( _
        
ByVal  lpExistingFileName  As   String , _
        
ByVal  lpNewFileName  As   String , _
        
ByVal  lpProgressRoutine  As  CopyProgressRoutine, _
        
ByVal  lpData  As  IntPtr, _
        
ByRef  pbCancel  As  Int32, _
        
ByVal  dwCopyFlags  As  ECopyFileFlags)  As   Boolean
    
End Function

    
'''   <summary>
    
'''  執行 CopyFileEx 方法的回呼函式定義。
    
'''   </summary>
     Delegate   Function  CopyProgressRoutine( _
        
ByVal  TotalFileSize  As   Long , _
        
ByVal  TotalBytesTransferred  As   Long , _
        
ByVal  StreamSize  As   Long , _
        
ByVal  StreamBytesTransferred  As   Long , _
        
ByVal  dwStreamNumber  As   UInteger , _
        
ByVal  dwCallbackReason  As  ECopyProgressCallbackReason, _
        
ByVal  hSourceFile  As  IntPtr, _
        
ByVal  hDestinationFile  As  IntPtr, _
        
ByVal  lpData  As  IntPtr)  As  ECopyProgressResult

    
'''   <summary>
    
'''  執行 CopyFileEx 的回呼函式的回傳列舉。
    
'''   </summary>
     Enum  ECopyProgressResult  As   UInteger
        PROGRESS_CONTINUE 
=   0
        PROGRESS_CANCEL 
=   1
        PROGRESS_STOP 
=   2
        PROGRESS_QUIET 
=   3
    
End Enum

    
Enum  ECopyProgressCallbackReason  As   UInteger
        CALLBACK_CHUNK_FINISHED 
=   0
        CALLBACK_STREAM_SWITCH 
=   1
    
End Enum

    
< Flags() >  _
    
Enum  ECopyFileFlags  As   UInteger
        COPY_FILE_FAIL_IF_EXISTS 
=   1
        COPY_FILE_RESTARTABLE 
=   2
        COPY_FILE_OPEN_SOURCE_FOR_WRITE 
=   4
        COPY_FILE_ALLOW_DECRYPTED_DESTINATION 
=   8
    
End Enum

    
Private   Function  XCopy( ByVal  oldFile  As   String ByVal  newFile  As   String As   Boolean
        
Return  CopyFileEx(oldFile, newFile,  New  CopyProgressRoutine( AddressOf   Me .CopyProgressHandler), IntPtr.Zero, pbCancel, ECopyFileFlags.COPY_FILE_RESTARTABLE)
    
End Function

    
Private   Function  CopyProgressHandler( ByVal  total  As   Long ByVal  transferred  As   Long ByVal  streamSize  As   Long ByVal  StreamByteTrans  As   Long ByVal  dwStreamNumber  As   UInteger ByVal  reason  As  ECopyProgressCallbackReason, _
     
ByVal  hSourceFile  As  IntPtr,  ByVal  hDestinationFile  As  IntPtr,  ByVal  lpData  As  IntPtr)  As  ECopyProgressResult
        Label1.Text 
=   String .Format( " 進度: {0}% " CInt (transferred  /  total  *   100 ))
        Application.DoEvents()

        
Return  ECopyProgressResult.PROGRESS_CONTINUE
    
End Function

    
Private   Sub  btnCopy_Click( ByVal  sender  As  System.Object,  ByVal  e  As  System.EventArgs)  Handles  btnCopy.Click
        
If  XCopy( " C:\Source.avi " " D:\New.avi " Then
            
MsgBox ( " 複製成功 " )
        
Else
            
MsgBox ( " 複製失敗 " )
        
End   If

    
End Sub

    
Private   Sub  btnCancel_Click( ByVal  sender  As  System.Object,  ByVal  e  As  System.EventArgs)  Handles  btnCancel.Click
        pbCancel 
=   1
        Application.DoEvents()
    
End Sub
End Class

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值