📄 directorywatcher.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 + -