DragonNest/Client/EtActionTool/FileChangeNotification.cpp
2024-12-19 09:48:26 +08:00

76 lines
No EOL
1.9 KiB
C++

#include "stdafx.h"
#include "FileChangeNotification.h"
HANDLE CFileChangeNotification::s_hThreadHandle = NULL;
int CFileChangeNotification::s_nThreadStatus = CFileChangeNotification::eThread_State_Enabled;
std::wstring CFileChangeNotification::m_wszPath;
bool CFileChangeNotification::m_bSubTree = false;
DWORD CFileChangeNotification::m_FilterFlag = FILE_NOTIFY_CHANGE_LAST_WRITE | FILE_NOTIFY_CHANGE_LAST_ACCESS;
CFileChangeNotification::CFileChangeNotification()
: m_dwThreadIndex( 0 )
{
}
CFileChangeNotification::~CFileChangeNotification()
{
EndFileChangeNotification();
}
UINT __stdcall CFileChangeNotification::ChangeNotification( void *pParam )
{
CFileChangeNotification * pThis = (CFileChangeNotification *)pParam;
if( NULL == s_hThreadHandle )
{
s_nThreadStatus = eThread_State_Enable_Destroy;
_endthreadex( 0 );
return 0;
}
s_nThreadStatus = eThread_State_Executing;
HANDLE hHandle = FindFirstChangeNotificationW( m_wszPath.c_str(), m_bSubTree, m_FilterFlag );
if( INVALID_HANDLE_VALUE != hHandle )
{
do
{
if( WaitForMultipleObjects( 2, &hHandle, false, INFINITE ) == WAIT_OBJECT_0 )
{
// 파일이 변경 되었을 경우 처리를 해준다.
break;
}
} while ( FindNextChangeNotification( hHandle ) );
FindCloseChangeNotification( hHandle );
}
_endthreadex( 0 );
return 0;
}
void CFileChangeNotification::StartFileChangeNotification( WCHAR * wszPath, bool bSubTree, DWORD FilterFlag )
{
EndFileChangeNotification();
s_hThreadHandle = (HANDLE)_beginthreadex( NULL, 65536, ChangeNotification, (void*)this, 0, &m_dwThreadIndex );
}
void CFileChangeNotification::EndFileChangeNotification()
{
if( s_hThreadHandle )
{
s_nThreadStatus = eThread_State_Request_Destroy;
while(1)
{
Sleep(1);
if( eThread_State_Enable_Destroy == s_nThreadStatus )
break;
}
CloseHandle( s_hThreadHandle );
s_hThreadHandle = NULL;
m_dwThreadIndex = 0;
}
}