123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132 |
- //Download by http://www.NewXing.com
- // 名称: CFileWatcher
- // 功能: 监测指定目录中的文件/目录的改变
- // 环境要求: Requires Windows NT 3.51 SP3 or later, and Unsupported Windows 95/98.
- // 作者: 程红秀
- // 日期: 2004-11-10
- // 说明: Windows XP SP1 下测试通过
- #define _WIN32_WINNT 0x0500
- #include <windows.h>
- #include <string>
- using namespace std;
- /*-------------------------类的定义部分------------------------*/
- class CFileWatcher
- {
- public:
- bool StartWatch( string path); //开始监视
- CFileWatcher() // 初始化
- {
- hThread=NULL;
- hDir=INVALID_HANDLE_VALUE ;
- }
- ~CFileWatcher()
- {
- if(hThread !=NULL)
- {
- ::TerminateThread(hThread, 0 );
- hThread = NULL;
- }
- if(hDir !=INVALID_HANDLE_VALUE)
- {
- CloseHandle( hDir );
- hDir = INVALID_HANDLE_VALUE;
- }
- }
-
- private:
- string strWatchedDir;
- HANDLE hThread;
- HANDLE hDir;
- private:
- static DWORD WINAPI ThreadProc( LPVOID lParam ) ; //线程函数,用来监视
- };
- /*-------------------------类的函数实现部分------------------------*/
- bool CFileWatcher::StartWatch( string path)
- {
- strWatchedDir = path;
-
- DWORD ThreadId; //创建一个新线程用于监视
- hThread=::CreateThread(NULL,0,ThreadProc,this,0,&ThreadId );
-
- return NULL!=hThread;
- }
- DWORD WINAPI CFileWatcher::ThreadProc( LPVOID lParam ) //线程函数
- {
- CFileWatcher* obj = (CFileWatcher*)lParam; //参数转化
-
- obj->hDir = CreateFile( //打开目录,得到目录的句柄
- obj->strWatchedDir.c_str(),
- GENERIC_READ|GENERIC_WRITE,
- FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
- NULL,
- OPEN_EXISTING,
- FILE_FLAG_BACKUP_SEMANTICS,
- NULL
- );
- if(obj->hDir ==INVALID_HANDLE_VALUE )
- return false;
-
- char buf[(sizeof(FILE_NOTIFY_INFORMATION)+MAX_PATH)*2];
- FILE_NOTIFY_INFORMATION* pNotify=(FILE_NOTIFY_INFORMATION*)buf;
- DWORD dwBytesReturned;
- while(true)
- {
- if( ::ReadDirectoryChangesW( obj->hDir,
- pNotify,
- sizeof(buf),
- true,
- FILE_NOTIFY_CHANGE_FILE_NAME|
- FILE_NOTIFY_CHANGE_DIR_NAME|
- FILE_NOTIFY_CHANGE_ATTRIBUTES|
- FILE_NOTIFY_CHANGE_SIZE|
- FILE_NOTIFY_CHANGE_LAST_WRITE|
- FILE_NOTIFY_CHANGE_LAST_ACCESS|
- FILE_NOTIFY_CHANGE_CREATION|
- FILE_NOTIFY_CHANGE_SECURITY,
- &dwBytesReturned,
- NULL,
- NULL ) )
- {
- char tmp[MAX_PATH], str1[MAX_PATH], str2[MAX_PATH];
- memset( tmp, 0, sizeof(tmp) ); //ZeroMemory()
- WideCharToMultiByte( CP_ACP,0,pNotify->FileName,pNotify->FileNameLength/2,tmp,99,NULL,NULL );
- strcpy( str1, tmp );
-
- if(pNotify->NextEntryOffset !=0 )
- {
- PFILE_NOTIFY_INFORMATION p = (PFILE_NOTIFY_INFORMATION)((char*)pNotify+pNotify->NextEntryOffset);
- memset( tmp, 0, sizeof(tmp) );
- WideCharToMultiByte( CP_ACP,0,p->FileName,p->FileNameLength/2,tmp,99,NULL,NULL );
- strcpy( str2, tmp );
- }
- switch(pNotify->Action)
- {
- case FILE_ACTION_ADDED:
- cout << "添加了新文件: " << str1 << endl; break;
- case FILE_ACTION_REMOVED:
- cout << "删除了文件: " << str1 << endl; break;
- case FILE_ACTION_MODIFIED:
- cout << "修改了文件:" << str1 << endl; break;
- case FILE_ACTION_RENAMED_NEW_NAME:
- cout << "重命名了文件" << str1 << " " << str2 << endl; break;
- }
- }
- else
- break;
- }
- return 0;
- }
|