#define _WIN32_WINNT 0x0400
#include
#include
#include
HANDLE GcCreateThread(unsigned (__stdcall *start_address)(void *), char* param, unsigned* thrdaddr)
{
return (HANDLE)_beginthreadex(NULL,
0,
start_address,
param,
0,
thrdaddr);
}
#define Locate(type, begin, offset) (type)((char*)(begin) + (offset))
class CDirectoryMonitor
{
public:
CDirectoryMonitor(char* szDir)
{
strcpy(m_szDir, szDir);
Init();
}
~CDirectoryMonitor()
{
this->WaitForExit();
}
private:
char m_szDir[MAX_PATH];
// no use ...
char* m_pFileChangeList;
private:
int Init()
{
// ...
m_hDirectory = CreateFileA(m_szDir, FILE_LIST_DIRECTORY,
FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, NULL,
OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED, NULL);
unsigned int nThrdAddr = 0;
m_hThread = GcCreateThread(MonitorProc, NULL, &nThrdAddr);
return 0;
}
int WaitForExit()
{
#ifdef _DEBUG
printf("enter WaitForExit()/n");
#endif
//
if(m_hDirectory != NULL)
{
CloseHandle(m_hDirectory);
m_hDirectory = NULL;
}
if(m_hThread != NULL)
{
WaitForSingleObject(m_hThread, INFINITE);
m_hThread = NULL;
}
#ifdef _DEBUG
printf("outer WaitForExit()/n");
#endif
return 0;
}
static unsigned __stdcall MonitorProc(void* param)
{
while(1)
{
//
char* szBuf[1024] = {0};
DWORD dwNotifyFilter = FILE_NOTIFY_CHANGE_FILE_NAME | FILE_NOTIFY_CHANGE_DIR_NAME
| FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_CREATION
| FILE_NOTIFY_CHANGE_SECURITY;
DWORD nByteReturned = 0;
int ret = ReadDirectoryChangesW(m_hDirectory, szBuf, sizeof(szBuf),
true, dwNotifyFilter, &nByteReturned, NULL, NULL);
if(ret == 0)
{
if(ERROR_INVALID_HANDLE == GetLastError())
{
printf("............break/n");
break;
}
}
// 下面的循环处理的是一个消息,
// 比如说“重命名”,它会有多个FILE_NOTIFY_INFORMATION;
// 而对于“保存”,它将会有2个FILE_ACTION_MODIFIED,是因为改变了属性,
// 但并不是在下面的一个循环中处理,它会分两次ReadDirectoryChangesW发过来
FILE_NOTIFY_INFORMATION* lpfni = (FILE_NOTIFY_INFORMATION*)szBuf;
do
{
switch(lpfni->Action)
{
case FILE_ACTION_ADDED:
wprintf(L"add, fileName = %s/n", lpfni->FileName);
break;
case FILE_ACTION_REMOVED:
wprintf(L"remove, fileName = %s/n", lpfni->FileName);
break;
case FILE_ACTION_MODIFIED:
wprintf(L"modify, fileName = %s/n", lpfni->FileName);
break;
case FILE_ACTION_RENAMED_OLD_NAME:
wprintf(L"rename, old_fileName = %s/n", lpfni->FileName);
break;
case FILE_ACTION_RENAMED_NEW_NAME:
wprintf(L"rename, new_fileName = %s/n", lpfni->FileName);
break;
default:
break;
}
}while(lpfni->NextEntryOffset != 0 &&
(lpfni = Locate(FILE_NOTIFY_INFORMATION*, lpfni, lpfni->NextEntryOffset)) != 0);
}
return 0;
}
private:
HANDLE m_hThread;
//
static HANDLE m_hDirectory;
};
HANDLE CDirectoryMonitor::m_hDirectory = NULL;
void Test()
{
class CDirectoryMonitor dm("D://");
getchar();
//Sleep(1* 60 * 1000);
}
void main()
{
Test();
getchar();
}
filemonitor
最新推荐文章于 2025-03-30 00:10:56 发布