#define _WIN32_WINNT 0x0500
#include
#include
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;
}
在对话框 的头文件中加入:
private:
CString m_strWatchedDir;
HANDLE m_hThread;
HANDLE hDir;
static DWORD WINAPI ThreadProc( LPVOID lParam ) ; //线程函数,用来监视
用于监视的线程:
DWORD WINAPI CDDlg::ThreadProc( LPVOID lParam ) //线程函数
{
CDDlg* obj = (CDDlg*)lParam; //参数转化
obj->hDir = CreateFile( //打开目录,得到目录的句柄
obj->m_strWatchedDir,
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:
if(obj->m_bAddNew0)
{
CTime tt=CTime::GetCurrentTime();
CString strTT;
strTT.Format("%d:%d:%d",tt.GetHour(),tt.GetMinute(),tt.GetSecond());
obj->m_list.InsertItem(0,obj->m_szi);
obj->m_list.SetItemText(0,2,"添加了新文件");
obj->m_list.SetItemText(0,3,str1);
obj->m_list.SetItemText(0,1,strTT);
// PlaySound(MAKEINTRESOURCE(IDR_WAVE1),AfxGetResourceHandle(),SND_RESOURCE|SND_PURGE|SND_NODEFAULT);
}
break;
case FILE_ACTION_REMOVED:
if(obj->m_bDel0)
{
CTime tt=CTime::GetCurrentTime();
CString strTT;
strTT.Format("%d:%d:%d",tt.GetHour(),tt.GetMinute(),tt.GetSecond());
obj->m_list.InsertItem(0,obj->m_szi);
obj->m_list.SetItemText(0,2,"删除了文件");
obj->m_list.SetItemText(0,3,str1);
obj->m_list.SetItemText(0,1,strTT);
// PlaySound(MAKEINTRESOURCE(IDR_WAVE1),AfxGetResourceHandle(),SND_RESOURCE|SND_PURGE|SND_NODEFAULT);
}
break;
case FILE_ACTION_RENAMED_NEW_NAME:
if(obj->m_bRename0)
{
CTime tt=CTime::GetCurrentTime();
CString strTT;
strTT.Format("%d:%d:%d",tt.GetHour(),tt.GetMinute(),tt.GetSecond());
obj->m_list.InsertItem(0,obj->m_szi);
obj->m_list.SetItemText(0,2,"重命名了文件");
strcat(str1,"->");
obj->m_list.SetItemText(0,3,strcat(str1,str2));
obj->m_list.SetItemText(0,1,strTT);
// PlaySound(MAKEINTRESOURCE(IDR_WAVE1),AfxGetResourceHandle(),SND_RESOURCE|SND_PURGE|SND_NODEFAULT);
}
break;
case FILE_ACTION_RENAMED_OLD_NAME:
if(obj->m_bRename0)
{
CTime tt=CTime::GetCurrentTime();
CString strTT;
strTT.Format("%d:%d:%d",tt.GetHour(),tt.GetMinute(),tt.GetSecond());
obj->m_list.InsertItem(0,obj->m_szi);
obj->m_list.SetItemText(0,2,"重命名了文件");
strcat(str1," 改名为 ");
obj->m_list.SetItemText(0,3,strcat(str1,str2));
obj->m_list.SetItemText(0,1,strTT);
// PlaySound(MAKEINTRESOURCE(IDR_WAVE1),AfxGetResourceHandle(),SND_RESOURCE|SND_PURGE|SND_NODEFAULT);
}
break;
case FILE_ACTION_MODIFIED:
if(obj->m_bModify0)
{
CTime tt=CTime::GetCurrentTime();
CString strTT;
strTT.Format("%d:%d:%d",tt.GetHour(),tt.GetMinute(),tt.GetSecond());
obj->m_list.InsertItem(0,obj->m_szi);
obj->m_list.SetItemText(0,2,"修改了文件");
obj->m_list.SetItemText(0,3,str1);
obj->m_list.SetItemText(0,1,strTT);
// PlaySound(MAKEINTRESOURCE(IDR_WAVE1),AfxGetResourceHandle(),SND_RESOURCE|SND_PURGE|SND_NODEFAULT);
}
break;
default:
if(obj->m_bOther0)
{
CTime tt=CTime::GetCurrentTime();
CString strTT;
strTT.Format("%d:%d:%d",tt.GetHour(),tt.GetMinute(),tt.GetSecond());
obj->m_list.InsertItem(0,obj->m_szi);
obj->m_list.SetItemText(0,2,"未知变化");
obj->m_list.SetItemText(0,3,"");
obj->m_list.SetItemText(0,1,strTT);
// PlaySound(MAKEINTRESOURCE(IDR_WAVE1),AfxGetResourceHandle(),SND_RESOURCE|SND_PURGE|SND_NODEFAULT);
}
break;
}
obj->m_i++;
itoa(obj->m_i,obj->m_szi,10);
//AfxBeginThread(SoundThread,0);
}
else
break;
}
return 0;
}
/*----------------------线程函数------------------------------------*/
按扭处理函数:
void CDDlg::OnStart()
{
this->StartWatch(m_strWatchedDir);
GetDlgItem(IDC_STOP)->EnableWindow(true);
GetDlgItem(IDC_START)->EnableWindow(false);
GetDlgItem(IDC_SELECT_DIR)->EnableWindow(false);
GetDlgItem(IDC_STATE)->SetWindowText("正在监视... "+m_strWatchedDir);
}
void CDDlg::OnStop()
{
GetDlgItem(IDC_STATE)->SetWindowText("停止了监视"+m_strWatchedDir);
if(m_hThread !=NULL)
{
::TerminateThread(m_hThread, 0 );
m_hThread = NULL;
}
if(hDir !=INVALID_HANDLE_VALUE)
{
CloseHandle( hDir );
hDir = INVALID_HANDLE_VALUE;
}
GetDlgItem(IDC_STOP)->EnableWindow(false);
GetDlgItem(IDC_START)->EnableWindow(true);
GetDlgItem(IDC_SELECT_DIR)->EnableWindow(true);
}
void CDDlg::OnClear()
{
PlaySound(MAKEINTRESOURCE(IDR_WAVE2),AfxGetResourceHandle(),SND_RESOURCE|SND_PURGE|SND_NODEFAULT);
m_list.DeleteAllItems();
}