⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 directorywatcher.cpp

📁 监测指定目录的变化
💻 CPP
字号:
/*

*/


#include "DirectoryWatcher.h"
#include <winbase.h>
#include <time.h>

#include <sys/types.h>
#include <sys/timeb.h>

CDirectoryWatcher::CDirectoryWatcher()
{
	hThread=NULL;
	hDir=INVALID_HANDLE_VALUE;
	strWatchedDir="";
}

CDirectoryWatcher::~CDirectoryWatcher()
{
	Stop();
#ifdef	TCONSOLE
	cout<<"class quit now"<<endl;
#endif
}

bool	CDirectoryWatcher::Start(string path)
{
	Set(path);
	return Start();
	/*strWatchedDir=path;
	DWORD ThreadID;
	
	hThread=::CreateThread(NULL,0,ThreadProc,this,0,&ThreadID);

	return NULL!=hThread;*/

}
inline	bool	CDirectoryWatcher::Start()
{
	if(Status())
		return true;
	if(strWatchedDir.empty())
		return false;
	DWORD ThreadID;	
	hThread=::CreateThread(NULL,0,ThreadProc,this,0,&ThreadID);

	return NULL!=hThread;
}
inline void	CDirectoryWatcher::Stop()
{
	if(hThread!=NULL)
	{
		::TerminateThread(hThread,0);
		hThread=NULL;
	}
	if(hDir!=INVALID_HANDLE_VALUE)
	{
		CloseHandle(hDir);
		hDir=INVALID_HANDLE_VALUE;
	}
#ifdef	TCONSOLE
	cout<<"Stop()"<<endl;
#endif
}
inline	bool	CDirectoryWatcher::Status()
{
	if(hThread!=NULL)
		return true;
	return false;
}
inline	void	CDirectoryWatcher::Set(string path)
{
	if(Status())
		Stop();
	strWatchedDir=path;
}
string	CDirectoryWatcher::Get()
{
	return strWatchedDir;
}
DWORD WINAPI CDirectoryWatcher::ThreadProc(LPVOID lParam)
{

	CDirectoryWatcher* obj=(CDirectoryWatcher*)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;
#ifdef	TCONSOLE
	cout<<"thread started...."<<endl;
#endif
	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));
			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,pNotify->FileName,pNotify->FileNameLength/2,tmp,99,NULL,NULL);
				strcpy(str2,tmp);
			}

			switch(pNotify->Action)
			{
			case	FILE_ACTION_ADDED:
#ifdef	TCONSOLE
				cout<<"add new file: \t"<<str1<<endl;
#endif
				break;
			case	FILE_ACTION_REMOVED:
#ifdef	TCONSOLE
				cout<<"del one file: \t"<<str1<<endl;
#endif
				break;
			case	FILE_ACTION_MODIFIED:
#ifdef	TCONSOLE
				cout<<"modified file: \t"<<str1<<endl;
#endif
				break;
			case	FILE_ACTION_RENAMED_NEW_NAME:
#ifdef	TCONSOLE
				cout<<"renamed to new file: \t"<<str1<<"\t to: \t"<<str2<<endl;
#endif
				break;
			case	FILE_ACTION_RENAMED_OLD_NAME:
#ifdef	TCONSOLE
				cout<<"renamed from old file: \t"<<str1<<"\t to: \t"<<str2<<endl;
#endif
				break;
			default:
#ifdef	TCONSOLE
				cout<<"unLABLEED ACTION"<<endl;
#endif
				break;
			}
		}
	}
	return 0;	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -