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

📄 filechangeevent.cpp

📁 本程序使您在文件改变时得到通知
💻 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 + -