FileCopy.h 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. // FileCopy.h: interface for the CFileCopy class.
  2. //
  3. //////////////////////////////////////////////////////////////////////
  4. #if !defined(AFX_FILECOPY_H__061C1E4E_649D_4AF3_8950_69452B3909CA__INCLUDED_)
  5. #define AFX_FILECOPY_H__061C1E4E_649D_4AF3_8950_69452B3909CA__INCLUDED_
  6. #if _MSC_VER > 1000
  7. #pragma once
  8. #endif // _MSC_VER > 1000
  9. #include <string>
  10. #if (defined UNICODE) || (defined _UNICODE)
  11. #define tstring std::wstring
  12. #else
  13. #define tstring std::string
  14. #endif
  15. // 异步复制时,复制完后会回调
  16. // pUserData : CFileCopy::SetUserData()设置的值
  17. // bCopySuccess : 复制是否成功
  18. // dbSpeed : 若复制成功,保存平均速度,单位Byte/MS(字节/毫秒)
  19. // strErrorMsg : 若复制失败,保存失败信息
  20. typedef BOOL (__stdcall * LPAsyncCopyResultCB)(
  21. const void * const pUserData,
  22. const BOOL bCopySuccess,
  23. const DOUBLE dbSpeed,
  24. const tstring strErrorMsg
  25. );
  26. // 复制过程中,定义回调返回进度等
  27. // pUserData : CFileCopy::SetUserData()设置的值
  28. // dbSpeed : 复制速度,单位Byte/MS(字节/毫秒)
  29. // dwPercentage : 复制百分比
  30. typedef BOOL (__stdcall * LPCopingProgressCB)(
  31. const void * const pUserData,
  32. const DOUBLE dbSpeed,
  33. const DWORD dwPercentage
  34. );
  35. class CFileCopy
  36. {
  37. public:
  38. CFileCopy();
  39. virtual ~CFileCopy();
  40. public:
  41. // 同步复制返回值表示是否复制成功
  42. // 异步复制表示发起复制是否成功
  43. BOOL CopyFile(
  44. IN LPCTSTR lpSrcFileName, // 源文件名
  45. IN LPCTSTR lpDesFileName, // 目标文件名
  46. IN const BOOL bSynchronousCopy, // 是否同步复制
  47. IN const DWORD dwProgressFeedbackTime,
  48. // 复制过程中反馈进度间隔时长,单位毫秒,0不反馈
  49. OUT DOUBLE &dbSpeed, // 若复制成功,保存平均速度,单位Byte/MS(字节/毫秒)
  50. OUT tstring &strErrorMsg // 复制失败原因
  51. );
  52. void Pause(); // 暂停
  53. void Resume(); // 恢复
  54. void Cancel(); // 取消
  55. DWORD64 GetTotalFileSize()
  56. {
  57. return m_dw64TotalFileSize;
  58. }
  59. DWORD64 GetTotalBytesTransferred()
  60. {
  61. return m_dw64TotalBytesTransferred;
  62. }
  63. void SetUserData(void *pUserData)
  64. {
  65. m_pUserData = pUserData;
  66. }
  67. void SetAsyncCopyResultCB(LPAsyncCopyResultCB pAsyncCopyResultCB)
  68. {
  69. m_pAsyncCopyResultCB = pAsyncCopyResultCB;
  70. }
  71. void SetCopingProgressCB(LPCopingProgressCB pCopingProgressCB)
  72. {
  73. m_pCopingProgressCB = pCopingProgressCB;
  74. }
  75. protected:
  76. // 同步复制文件
  77. BOOL SynchronousCopyFile(
  78. LPCTSTR lpSrcFileName,
  79. LPCTSTR lpDesFileName,
  80. const DWORD dwProgressFeedbackTime,
  81. DOUBLE &dbSpeed,
  82. tstring &strErrorMsg);
  83. tstring GetLastErrorMsg(LPCTSTR lpszFunction, const DWORD dwLastError);
  84. static DWORD CALLBACK CopyProgressRoutine(
  85. LARGE_INTEGER TotalFileSize,
  86. LARGE_INTEGER TotalBytesTransferred,
  87. LARGE_INTEGER StreamSize,
  88. LARGE_INTEGER StreamBytesTransferred,
  89. DWORD dwStreamNumber,
  90. DWORD dwCallbackReason,
  91. HANDLE hSourceFile,
  92. HANDLE hDestinationFile,
  93. LPVOID lpData
  94. );
  95. void CloseAllHandles();
  96. // 异步复制线程
  97. unsigned AsyncCopy();
  98. static unsigned __stdcall AsyncCopyThreadFunc(void* pArguments);
  99. // 反馈进度线程
  100. unsigned FeedbackProgress();
  101. static unsigned __stdcall FeedbackProgressThreadFunc(void* pArguments);
  102. protected:
  103. BOOL m_bCancel; // 是否取消复制标志
  104. DWORD64 m_dw64TotalFileSize; // 文件总大小
  105. DWORD64 m_dw64TotalBytesTransferred; // 已复制的大小
  106. CRITICAL_SECTION m_csLock; // 用于同步的CS
  107. BOOL m_bIsCoping; // 是否处于复制中
  108. HANDLE m_hPauseEvent; // 控件复制暂停恢复的事件
  109. HANDLE m_hFeedbackExitEvent; // 反馈进度线程退出事件
  110. HANDLE m_hAsyncCopyThreadHandle; // 异步复制线程句柄
  111. HANDLE m_hFeedbackProgressThreadHandle; // 反馈进度线程句柄
  112. tstring m_strSrcFile; // 源文件名
  113. tstring m_strDesFile; // 目标文件名
  114. DWORD m_dwProgressFeedbackTime; // 复制过程中反馈进度间隔时长,单位毫秒,0不反馈
  115. void *m_pUserData; // 异步回调时会使用
  116. LPAsyncCopyResultCB m_pAsyncCopyResultCB;
  117. // 异步复制回调
  118. LPCopingProgressCB m_pCopingProgressCB; // 复制过程中定时回调返回进度等
  119. };
  120. #endif // !defined(AFX_FILECOPY_H__061C1E4E_649D_4AF3_8950_69452B3909CA__INCLUDED_)