📄 filechangeevent.cpp
字号:
// FileChangeEvent.cpp: implementation of the CFileChangeEvent class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "FileChangeEvent.h"
#include "FileInfo.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
CFileChangeEvent::CFileChangeEvent()
{
m_bEvent = false;
}
CFileChangeEvent::~CFileChangeEvent()
{
if ( m_bEvent )
stopWatch();
for (FileInfoMap::iterator it = m_FileInfoMap.begin(); it != m_FileInfoMap.end(); it++)
delete it->second;
m_FileInfoMap.clear();
for (FilePathVector::iterator it2 = m_Paths.begin(); it2 != m_Paths.end(); it2++)
delete *it2;
m_Paths.clear();
}
void CFileChangeEvent::startWatch(void)
{
if ( ! m_bEvent )
{
m_evStopWatch.ResetEvent();
m_bEvent = (AfxBeginThread(FileChangeWatch,(LPVOID)this) != NULL);
}
}
void CFileChangeEvent::stopWatch(void)
{
if ( m_bEvent )
{
m_bEvent = false;
m_evStopWatch.SetEvent();
}
}
void CFileChangeEvent::addFile(const std::string &sFileName)
{
if ( m_FileInfoMap.find(sFileName) != m_FileInfoMap.end() )
return;
CFileInfo *f = new CFileInfo(sFileName);
m_FileInfoMap.insert(std::make_pair(sFileName, f));
for (FilePathVector::iterator it = m_Paths.begin(); it != m_Paths.end(); it++)
{
if ( (*it)->getName() == f->getPath() )
{
(**it)++;
return;
}
}
m_Paths.push_back(new CFilePath(f->getPath()));
if ( m_bEvent )
{
stopWatch();
startWatch();
}
}
void CFileChangeEvent::removeFile(const std::string &sFileName)
{
CFileInfo f(sFileName);
for (FilePathVector::iterator it = m_Paths.begin(); it != m_Paths.end(); it++)
{
if ( (*it)->getName() == f.getPath() )
{
(**it)--;
if ( (*it)->getCount() == 0 )
{
delete *it;
m_Paths.erase(it);
}
return;
}
}
}
UINT CFileChangeEvent::FileChangeWatch(LPVOID lpParam)
{
CFileChangeEvent *pFileChangeEvent = (CFileChangeEvent *) lpParam;
HANDLE *hChangeHandles = new HANDLE[pFileChangeEvent->m_Paths.size() + 1];
while ( 1 ) //endless loop
{
hChangeHandles[0] = pFileChangeEvent->m_evStopWatch;
for (int i = 0; i < pFileChangeEvent->m_Paths.size(); i++)
{
hChangeHandles[i+1] = FindFirstChangeNotification(pFileChangeEvent->m_Paths[i]->getName().c_str(),
FALSE,
FILE_NOTIFY_CHANGE_LAST_WRITE
| FILE_NOTIFY_CHANGE_SIZE
| FILE_NOTIFY_CHANGE_FILE_NAME
);
}
DWORD dwResult = WaitForMultipleObjects(pFileChangeEvent->m_Paths.size() + 1, hChangeHandles, FALSE, INFINITE);
if ( dwResult == WAIT_OBJECT_0 ) // Watch stopped
{
break;
}
int nPathIdx = dwResult - WAIT_OBJECT_0 - 1;
// Search for changed files
for (FileInfoMap::iterator it = pFileChangeEvent->m_FileInfoMap.begin(); it != pFileChangeEvent->m_FileInfoMap.end(); it++)
{
if ( it->second->getPath() == pFileChangeEvent->m_Paths[nPathIdx]->getName() )
{
HANDLE f = CreateFile(it->second->getName().c_str(),
0,
FILE_SHARE_DELETE
| FILE_SHARE_READ
| FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if ( f )
{
FILETIME dtFileDate;
FILETIME dtCreateDate;
GetFileTime (f, &dtCreateDate, NULL, &dtFileDate);
CloseHandle(f);
if ( it->second->getDate().GetStatus() != COleDateTime::valid )
{
it->second->setDate(dtCreateDate);
pFileChangeEvent->OnFileAlarm(FA_CREATED, it->second->getName());
}
else
{
COleDateTime dtDate = dtFileDate;
if ( it->second->getDate() < dtDate )
{
it->second->setDate(dtDate);
pFileChangeEvent->OnFileAlarm(FA_CHANGED, it->second->getName());
}
}
}
else
{
pFileChangeEvent->OnFileAlarm(FA_REMOVED, it->second->getName());
pFileChangeEvent->removeFile(it->second->getName());
}
}
}
}
delete[] hChangeHandles;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -