DelFiles.cpp 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218
  1. #include "stdafx.h"
  2. #include "DelFiles.h"
  3. #include "ffscoex.h"
  4. #ifdef _DEBUG
  5. #define new DEBUG_NEW
  6. #undef THIS_FILE
  7. static char THIS_FILE[] = __FILE__;
  8. #endif
  9. using namespace helper_coffs;
  10. unsigned int __stdcall DelThreadPro(IN LPVOID lpParam);
  11. CSC_DelFiles::CSC_DelFiles()
  12. {
  13. m_dwRefCount = 0;
  14. m_hThread = NULL; //线程
  15. m_hEvent = NULL; //退出事件
  16. m_bRunning = FALSE; //是否正在运行
  17. m_PFCallBack = NULL; //回调
  18. }
  19. CSC_DelFiles::~CSC_DelFiles()
  20. {
  21. m_ListMgr.Release();
  22. TerminateDel();
  23. }
  24. STDMETHODIMP CSC_DelFiles::QueryInterface(REFIID refiid, void** ppv)
  25. {
  26. if (IID_IUnknown == refiid)
  27. *ppv = this;
  28. else if (IID_ISC_DELFILESINTERFACE == refiid)
  29. *ppv = (ISC_DelFilesInterface*)this;
  30. else
  31. {
  32. *ppv = NULL;
  33. return E_NOINTERFACE;
  34. }
  35. ((IUnknown*)(*ppv))->AddRef();
  36. return NOERROR;
  37. }
  38. STDMETHODIMP_(ULONG) CSC_DelFiles::AddRef(void)
  39. {
  40. InterlockedIncrement((LPLONG)&m_dwRefCount);
  41. return m_dwRefCount;
  42. }
  43. STDMETHODIMP_(ULONG) CSC_DelFiles::Release(void)
  44. {
  45. InterlockedDecrement((LPLONG)&m_dwRefCount);
  46. if (!m_dwRefCount)
  47. delete this;
  48. return 0;
  49. }
  50. /************************************************************************/
  51. /*
  52. 函数: AddDelData
  53. 描述: 添加要删除的数据
  54. 参数:
  55. IN LPCTSTR lpDomain, 域名
  56. IN LPCTSTR lpOrderNum, 订单
  57. IN LPCTSTR lpDir, 目录
  58. IN const BYTE byPhotoType, 相片类型
  59. IN const BOOL bPickuped 是否已取件
  60. 返回; 1成功,0失败
  61. */
  62. /************************************************************************/
  63. int CSC_DelFiles::AddDelData(IN LPCTSTR lpDomain, IN LPCTSTR lpOrderNum, IN LPCTSTR lpDir, IN const BYTE byPhotoType, IN const BOOL bPickuped)
  64. {
  65. LPSDELINFO lp = new SDELINFO;
  66. lp->Clone(lpDomain, lpOrderNum, lpDir, byPhotoType, bPickuped);
  67. m_ListMgr.Push_Back(lp);
  68. return 1;
  69. }
  70. /************************************************************************/
  71. /*
  72. 函数: StartDelFiles
  73. 描述: 删除文件
  74. 参数:
  75. 返回; 1成功,0失败
  76. */
  77. /************************************************************************/
  78. int CSC_DelFiles::StartDelFiles(IN PFCALLBACK callbackfun/*回调函数通知备份完成*/)
  79. {
  80. if(m_bRunning)
  81. return 0;
  82. m_PFCallBack = callbackfun;
  83. m_hEvent = CreateEvent(NULL, TRUE, FALSE, NULL);
  84. unsigned int nThreadID = 0;
  85. m_hThread = (HANDLE)_beginthreadex(NULL, 0, DelThreadPro, (void*)this, 0, &nThreadID);
  86. m_bRunning = TRUE;
  87. return 1;
  88. }
  89. /************************************************************************/
  90. /*
  91. 函数: TerminateDel
  92. 描述: 终止删除操作
  93. 参数:
  94. 返回;
  95. */
  96. /************************************************************************/
  97. void CSC_DelFiles::TerminateDel()
  98. {
  99. if(!m_bRunning)
  100. return;
  101. if(m_hEvent)
  102. SetEvent(m_hEvent);
  103. ::WaitForSingleObject(m_hThread, INFINITE);
  104. m_bRunning = FALSE;
  105. if(m_hThread)
  106. {
  107. CloseHandle(m_hThread);
  108. m_hThread = NULL;
  109. }
  110. if(m_hEvent)
  111. {
  112. CloseHandle(m_hEvent);
  113. m_hEvent = NULL;
  114. }
  115. }
  116. /************************************************************************/
  117. /*
  118. 函数: IsDeleting
  119. 描述: 是否正在删除文件
  120. 参数:
  121. 返回;
  122. */
  123. /************************************************************************/
  124. BOOL CSC_DelFiles::IsDeleting()
  125. {
  126. return m_bRunning;
  127. }
  128. /************************************************************************/
  129. /*
  130. 函数: DelWork
  131. 描述: 删除工作
  132. 参数:
  133. 返回;
  134. */
  135. /************************************************************************/
  136. void CSC_DelFiles::DelWork()
  137. {
  138. while(m_ListMgr.Size() != 0)
  139. {
  140. /*
  141. if(WaitForSingleObject(m_hEvent, 0) == WAIT_OBJECT_0)
  142. break;
  143. */
  144. LPSDELINFO lp = m_ListMgr.Pop_Front();
  145. if(lp != NULL)
  146. {
  147. BOOL bSuccess = DeleteDirectory(lp->szDir);
  148. m_PFCallBack(&lp->byPhotoType, lp->szDomain, lp->szOrderNum, lp->szDir, &bSuccess, NULL);
  149. delete lp;
  150. }
  151. Sleep(10);
  152. }
  153. if(m_hThread)
  154. {
  155. CloseHandle(m_hThread);
  156. m_hThread = NULL;
  157. }
  158. if(m_hEvent)
  159. {
  160. CloseHandle(m_hEvent);
  161. m_hEvent = NULL;
  162. }
  163. m_bRunning = FALSE;
  164. }
  165. /************************************************************************/
  166. /*
  167. 函数: DelThreadPro
  168. 描述: 线程函数
  169. 参数:
  170. LPVOID lpParam 任何类型指针
  171. 返回;
  172. */
  173. /************************************************************************/
  174. unsigned int __stdcall DelThreadPro(IN LPVOID lpParam)
  175. {
  176. CSC_DelFiles* p = (CSC_DelFiles*)lpParam;
  177. if(p)
  178. p->DelWork();
  179. return 0;
  180. }
  181. /************************************************************************/
  182. /*
  183. 函数:DeleteDirectory
  184. 描述:删除指定目录;
  185. 参数:
  186. IN: lpDirectory 要删除的目录;
  187. 返回: TRUE成功,FALSE失败
  188. */
  189. /************************************************************************/
  190. BOOL CSC_DelFiles::DeleteDirectory(IN LPCTSTR lpDiretory)// 可删除共享路径;
  191. {
  192. ffscoex coex;
  193. return coex.deldir(lpDiretory);
  194. }