FileWatcher.h 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. //Download by http://www.NewXing.com
  2. // 名称: CFileWatcher
  3. // 功能: 监测指定目录中的文件/目录的改变
  4. // 环境要求: Requires Windows NT 3.51 SP3 or later, and Unsupported Windows 95/98.
  5. // 作者: 程红秀
  6. // 日期: 2004-11-10
  7. // 说明: Windows XP SP1 下测试通过
  8. #define _WIN32_WINNT 0x0500
  9. #include <windows.h>
  10. #include <string>
  11. using namespace std;
  12. /*-------------------------类的定义部分------------------------*/
  13. class CFileWatcher
  14. {
  15. public:
  16. bool StartWatch( string path); //开始监视
  17. CFileWatcher() // 初始化
  18. {
  19. hThread=NULL;
  20. hDir=INVALID_HANDLE_VALUE ;
  21. }
  22. ~CFileWatcher()
  23. {
  24. if(hThread !=NULL)
  25. {
  26. ::TerminateThread(hThread, 0 );
  27. hThread = NULL;
  28. }
  29. if(hDir !=INVALID_HANDLE_VALUE)
  30. {
  31. CloseHandle( hDir );
  32. hDir = INVALID_HANDLE_VALUE;
  33. }
  34. }
  35. private:
  36. string strWatchedDir;
  37. HANDLE hThread;
  38. HANDLE hDir;
  39. private:
  40. static DWORD WINAPI ThreadProc( LPVOID lParam ) ; //线程函数,用来监视
  41. };
  42. /*-------------------------类的函数实现部分------------------------*/
  43. bool CFileWatcher::StartWatch( string path)
  44. {
  45. strWatchedDir = path;
  46. DWORD ThreadId; //创建一个新线程用于监视
  47. hThread=::CreateThread(NULL,0,ThreadProc,this,0,&ThreadId );
  48. return NULL!=hThread;
  49. }
  50. DWORD WINAPI CFileWatcher::ThreadProc( LPVOID lParam ) //线程函数
  51. {
  52. CFileWatcher* obj = (CFileWatcher*)lParam; //参数转化
  53. obj->hDir = CreateFile( //打开目录,得到目录的句柄
  54. obj->strWatchedDir.c_str(),
  55. GENERIC_READ|GENERIC_WRITE,
  56. FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
  57. NULL,
  58. OPEN_EXISTING,
  59. FILE_FLAG_BACKUP_SEMANTICS,
  60. NULL
  61. );
  62. if(obj->hDir ==INVALID_HANDLE_VALUE )
  63. return false;
  64. char buf[(sizeof(FILE_NOTIFY_INFORMATION)+MAX_PATH)*2];
  65. FILE_NOTIFY_INFORMATION* pNotify=(FILE_NOTIFY_INFORMATION*)buf;
  66. DWORD dwBytesReturned;
  67. while(true)
  68. {
  69. if( ::ReadDirectoryChangesW( obj->hDir,
  70. pNotify,
  71. sizeof(buf),
  72. true,
  73. FILE_NOTIFY_CHANGE_FILE_NAME|
  74. FILE_NOTIFY_CHANGE_DIR_NAME|
  75. FILE_NOTIFY_CHANGE_ATTRIBUTES|
  76. FILE_NOTIFY_CHANGE_SIZE|
  77. FILE_NOTIFY_CHANGE_LAST_WRITE|
  78. FILE_NOTIFY_CHANGE_LAST_ACCESS|
  79. FILE_NOTIFY_CHANGE_CREATION|
  80. FILE_NOTIFY_CHANGE_SECURITY,
  81. &dwBytesReturned,
  82. NULL,
  83. NULL ) )
  84. {
  85. char tmp[MAX_PATH], str1[MAX_PATH], str2[MAX_PATH];
  86. memset( tmp, 0, sizeof(tmp) ); //ZeroMemory()
  87. WideCharToMultiByte( CP_ACP,0,pNotify->FileName,pNotify->FileNameLength/2,tmp,99,NULL,NULL );
  88. strcpy( str1, tmp );
  89. if(pNotify->NextEntryOffset !=0 )
  90. {
  91. PFILE_NOTIFY_INFORMATION p = (PFILE_NOTIFY_INFORMATION)((char*)pNotify+pNotify->NextEntryOffset);
  92. memset( tmp, 0, sizeof(tmp) );
  93. WideCharToMultiByte( CP_ACP,0,p->FileName,p->FileNameLength/2,tmp,99,NULL,NULL );
  94. strcpy( str2, tmp );
  95. }
  96. switch(pNotify->Action)
  97. {
  98. case FILE_ACTION_ADDED:
  99. cout << "添加了新文件: " << str1 << endl; break;
  100. case FILE_ACTION_REMOVED:
  101. cout << "删除了文件: " << str1 << endl; break;
  102. case FILE_ACTION_MODIFIED:
  103. cout << "修改了文件:" << str1 << endl; break;
  104. case FILE_ACTION_RENAMED_NEW_NAME:
  105. cout << "重命名了文件" << str1 << " " << str2 << endl; break;
  106. }
  107. }
  108. else
  109. break;
  110. }
  111. return 0;
  112. }