怎样监控磁盘上的文件是否被打开过 要做这样一个监控程序: 当磁盘上的某一文件被 [打开]、删除、修改,将操作时间、结果记录下来。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 CFile::GetStatus()Static BOOL PASCAL GetStatus(LPCSTR lpszFileName,CFileStatus& rStatus);rStatus用户提供的CFileStatus结构的参考,用来接收状态信息。 CFileStatus结构有以下字段: CTime m_ctime 文件创建的时间。 CTime m_mtime 文件最后一次修改的时间。 CTime m_atime 最后一次访问文件并读取的时间。 ... 这是我刚看来的,是转载监控注册表和文件夹改动的类///////////////////////////////////////////////////////////////////////////////changenotify.h#pragma once#define ERROR_NOTIFY100000L#define ERROR_NOTIFY_ALREADY_START( ERROR_NOTIFY + 1 )///////////////////////////////////////////////////////////////////////////////DWORD CALLBACK ChangeMonitorThread( LPVOID pParam );class CChangeMonitor{public:CChangeMonitor();virtual ~CChangeMonitor();virtual BOOL StartMoniter( DWORD dwMonId, HWND hWnd );virtual void EndMoniter( void );virtual void Pause( void );virtual void Resume( void );protected:virtual void SendNotify( UINT nMsg );virtual void CallNextMoniter( void ) = 0;virtual DWORD WaitNotify( void ) = 0;protected:DWORD m_dwMonId;HANDLE m_hThread;HWND m_hWnd;DWORD m_dwThreadId;friend DWORD CALLBACK ChangeMonitorThread( LPVOID pParam );};///////////////////////////////////////////////////////////////////////////////class CDirectoryMonitor : public CChangeMonitor{public:CDirectoryMonitor();~CDirectoryMonitor();BOOL StartMoniter( DWORD dwMonId, HWND hWnd, LPCTSTR lpPath,BOOL bSubTree = TRUE, DWORD dwFilter = FILE_NOTIFY_CHANGE_LAST_WRITE );void EndMoniter( void );protected:virtual void CallNextMoniter( void );virtual DWORD WaitNotify( void );protected:HANDLE m_hNotify;};///////////////////////////////////////////////////////////////////////////////class CRegistryMonitor : public CChangeMonitor{public:CRegistryMonitor();~CRegistryMonitor();BOOL StartMoniter( DWORD dwMonId, HWND hWnd, HKEY hRoot, LPCTSTR lpSubKey,DWORD dwFilter = REG_NOTIFY_CHANGE_NAME | REG_NOTIFY_CHANGE_LAST_SET );void EndMoniter( void );protected:virtual void CallNextMoniter( void );virtual DWORD WaitNotify( void );protected:HANDLE m_hNotify;HKEY m_hKey;DWORD m_dwFilter;};///////////////////////////////////////////////////////////////////////////////changenotify.cpp#include "ChangeNotify.h"CChangeMonitor::CChangeMonitor( void ): m_hThread( NULL ), m_hWnd( NULL ), m_dwThreadId( 0 ), m_dwMonId( 0 ){}CChangeMonitor::~CChangeMonitor( void ){EndMoniter();}BOOL CChangeMonitor::StartMoniter( DWORD dwMonId, HWND hWnd ){// 判断是否已经启动监视if ( NULL != m_hThread ){SetLastError( ERROR_NOTIFY_ALREADY_START );TRACE_ERROR( GetLastError() );return FALSE;}// 检查参数if ( NULL == hWnd ){SetLastError( ERROR_INVALID_PARAMETER );TRACE_ERROR( GetLastError() );return FALSE;}m_dwMonId = dwMonId;m_hWnd = hWnd;// 创建监视线程m_hThread = CreateThread( NULL, 0, ChangeMonitorThread,(LPVOID)this, CREATE_SUSPENDED, &m_dwThreadId );ASSERT( NULL != m_hThread );return TRUE;}void CChangeMonitor::EndMoniter( void ){// 判断线程是否存在if ( m_hThread ){// 判断线程是否结束DWORD dwExitCode;VERIFY( GetExitCodeThread( m_hThread, &dwExitCode ) );if ( STILL_ACTIVE == dwExitCode ){ASSERT( m_dwThreadId != 0 );// 向线程发送退出消息VERIFY( PostThreadMessage( m_dwThreadId, WM_MONITER_EXIT, 0, 0 ) );// 使线程继续,以便结束Resume();// 等待线程退出DWORD dwWaitResult = WaitForSingleObject( m_hThread, INFINITE );ASSERT( WAIT_FAILED != dwWaitResult );// 如果等待超时,强制结束线程if ( WAIT_TIMEOUT == dwWaitResult ){if ( FALSE == TerminateThread( m_hThread, 0 ) ){TRACE_ERROR( -1 );}}}// 关闭线程句柄,将线程相关数据置零VERIFY( CloseHandle( m_hThread ) );m_hThread = NULL;m_dwThreadId = 0;}m_hWnd = NULL;// 通知窗体置零}void CChangeMonitor::Pause( void ){ASSERT( m_hThread );SuspendThread( m_hThread );}void CChangeMonitor::Resume( void ){ASSERT( m_hThread );ResumeThread( m_hThread );}void CChangeMonitor::SendNotify( UINT nMsg ){// 检查通知窗体句柄是否存在ASSERT( m_hWnd != NULL );// 发送通知消息if ( FALSE == PostMessage( m_hWnd, nMsg, m_dwMonId, 0 ) ){TRACE_ERROR( GetLastError() );}}DWORD CALLBACK ChangeMonitorThread( LPVOID pParam ){// 检查参数是否为空ASSERT( pParam != NULL );// 得到监视器类对象指针CChangeMonitor *pChaMon = (CChangeMonitor*)pParam;// 检查对象ASSERT( pChaMon->m_hThread != NULL );ASSERT( pChaMon->m_hWnd != NULL );ASSERT( pChaMon->m_dwThreadId != 0 );// 进入线程消息循环MSG msg;// 消息数据结构while( FALSE == PeekMessage( &msg, NULL, WM_MONITER_EXIT,WM_MONITER_EXIT, PM_REMOVE ) ){// 以0超时等待通知,直接返回等待结果DWORD dwWaitResult = pChaMon->WaitNotify();ASSERT( dwWaitResult != WAIT_FAILED );switch( dwWaitResult )// 处理等待结果{case WAIT_OBJECT_0:// 通知已接收// 向接收者发送通知消息pChaMon->SendNotify( WM_MONITER_CHANGED );// 继续下一次等待pChaMon->CallNextMoniter();break;case WAIT_TIMEOUT:break;}Sleep( 50 );}return 0;} ///////////////////////////////////////////////////////////////////////////////// CDirectoryMonitor// 构造函数CDirectoryMonitor::CDirectoryMonitor( void ): m_hNotify( NULL ){}// 析构函数CDirectoryMonitor::~CDirectoryMonitor( void ){}// 启动监视BOOL CDirectoryMonitor::StartMoniter( DWORD dwMonId, HWND hWnd, LPCTSTR lpPath, BOOL bSubTree, DWORD dwFilter ){// 调用父类同名函数if ( FALSE == CChangeMonitor::StartMoniter( dwMonId, hWnd ) ){return FALSE;}// 创建监视m_hNotify = FindFirstChangeNotification( lpPath, bSubTree, dwFilter );if ( INVALID_HANDLE_VALUE == m_hNotify ){m_hNotify = NULL;EndMoniter();TRACE_ERROR( GetLastError() );return FALSE;}// 启动监视线程VERIFY( ResumeThread( m_hThread ) );return TRUE;}void CDirectoryMonitor::EndMoniter( void ){// 调用父类同名函数CChangeMonitor::EndMoniter();// 判断通知句柄是否存在if ( m_hNotify ){// 结束通知VERIFY( FindCloseChangeNotification( m_hNotify ) );m_hNotify = NULL;// 通知句柄置零}}void CDirectoryMonitor::CallNextMoniter( void ){VERIFY( TRUE == FindNextChangeNotification( m_hNotify ) );}DWORD CDirectoryMonitor::WaitNotify( void ){return WaitForSingleObject( m_hNotify, 0 );}///////////////////////////////////////////////////////////////////////////////// CRegistryMonitor// 构造函数CRegistryMonitor::CRegistryMonitor( void ): m_hKey( NULL ), m_hNotify( NULL ), m_dwFilter( 0 ){}// 析构函数CRegistryMonitor::~CRegistryMonitor( void ){}// 启动监视BOOL CRegistryMonitor::StartMoniter( DWORD dwMonId, HWND hWnd, HKEY hRoot,LPCTSTR lpSubKey, DWORD dwFilter ){// 调用父类同名函数if ( FALSE == CChangeMonitor::StartMoniter( dwMonId, hWnd ) ){return FALSE;}// 成员数据赋值m_dwFilter = dwFilter;// 打开注册表键LONG lr;lr = RegOpenKeyEx( hRoot, lpSubKey, 0, KEY_NOTIFY, &m_hKey );if ( ERROR_SUCCESS != lr ){TRACE_ERROR( lr );return FALSE;}// 创建通知事件句柄m_hNotify = CreateEvent( NULL, FALSE, FALSE, NULL );ASSERT( NULL != m_hNotify );// 开始监视CallNextMoniter();// 启动监视线程VERIFY( ResumeThread( m_hThread ) );return TRUE;}// 结束监视void CRegistryMonitor::EndMoniter( void ){CChangeMonitor::EndMoniter();if ( m_hNotify ){VERIFY( CloseHandle( m_hNotify ) );m_hNotify = NULL;}if ( m_hKey ){VERIFY( ERROR_SUCCESS == RegCloseKey( m_hKey ) );m_hKey = NULL;}}void CRegistryMonitor::CallNextMoniter( void ){ASSERT( m_hKey != NULL );ASSERT( m_hNotify != NULL );// 创建监视句柄VERIFY( ERROR_SUCCESS == RegNotifyChangeKeyValue( m_hKey, TRUE,m_dwFilter, m_hNotify, TRUE ) );}DWORD CRegistryMonitor::WaitNotify( void ){return WaitForSingleObject( m_hNotify, 0 );}少了三个define,加到头文件里就行了#define WM_MONITER( WM_USER + 1000 )#define WM_MONITER_EXIT( WM_MONITER + 1 )#define WM_MONITER_CHANGED( WM_MONITER + 2 )忘了说用法了CDirectoryMonitor是用来监控文件夹CRegistryMonitor用来监控注册表键以CDirectoryMonitor为例CDirectoryMonitor DirNotify;DirNotify.StartMoniter( 给一个ID, 用来接收消息的窗体句柄,你要监控的文件夹 );在窗体里响应WM_MONITER_CHANGED事件,当WM_MONITER_CHANGED发送,就代表文件夹被改动了 函数跳转问题 游戏外挂按键 正则表达式的问题 这里高手多,只好在这里问了,一个按钮有两个字,声明一下,按钮足够大,足够长,可是点一下就会变成一个字了, 如何向MessageBox对话框发送关闭消息? 一个小问题!! 新手问题!100分! 初学COM,怎样在MFC的支持下开发跨平台跨编译器跨语言的COM组件呢? “多文件程序结构”如何编译? 【推荐】新手学Visual C++ vc中怎么添加Release选项? 加载 DLL 的问题
用户提供的CFileStatus结构的参考,用来接收状态信息。 CFileStatus结构有以下字段:
CTime m_ctime 文件创建的时间。
CTime m_mtime 文件最后一次修改的时间。
CTime m_atime 最后一次访问文件并读取的时间。
...
/////////////////////////////////////////////////////////////////////////////
//changenotify.h
#pragma once#define ERROR_NOTIFY100000L
#define ERROR_NOTIFY_ALREADY_START( ERROR_NOTIFY + 1 )///////////////////////////////////////////////////////////////////////////////DWORD CALLBACK ChangeMonitorThread( LPVOID pParam );
class CChangeMonitor
{
public:
CChangeMonitor();
virtual ~CChangeMonitor();
virtual BOOL StartMoniter( DWORD dwMonId, HWND hWnd );
virtual void EndMoniter( void );
virtual void Pause( void );
virtual void Resume( void );
protected:
virtual void SendNotify( UINT nMsg );
virtual void CallNextMoniter( void ) = 0;
virtual DWORD WaitNotify( void ) = 0;
protected:
DWORD m_dwMonId;
HANDLE m_hThread;
HWND m_hWnd;
DWORD m_dwThreadId;friend DWORD CALLBACK ChangeMonitorThread( LPVOID pParam );
};
///////////////////////////////////////////////////////////////////////////////class CDirectoryMonitor : public CChangeMonitor
{
public:
CDirectoryMonitor();
~CDirectoryMonitor();
BOOL StartMoniter( DWORD dwMonId, HWND hWnd, LPCTSTR lpPath,
BOOL bSubTree = TRUE, DWORD dwFilter = FILE_NOTIFY_CHANGE_LAST_WRITE );
void EndMoniter( void );
protected:
virtual void CallNextMoniter( void );
virtual DWORD WaitNotify( void );
protected:
HANDLE m_hNotify;
};///////////////////////////////////////////////////////////////////////////////class CRegistryMonitor : public CChangeMonitor
{
public:
CRegistryMonitor();
~CRegistryMonitor();
BOOL StartMoniter( DWORD dwMonId, HWND hWnd, HKEY hRoot, LPCTSTR lpSubKey,
DWORD dwFilter = REG_NOTIFY_CHANGE_NAME | REG_NOTIFY_CHANGE_LAST_SET );
void EndMoniter( void );
protected:
virtual void CallNextMoniter( void );
virtual DWORD WaitNotify( void );
protected:
HANDLE m_hNotify;
HKEY m_hKey;
DWORD m_dwFilter;
};/////////////////////////////////////////////////////////////////////////////
//changenotify.cpp#include "ChangeNotify.h"
CChangeMonitor::CChangeMonitor( void )
: m_hThread( NULL )
, m_hWnd( NULL )
, m_dwThreadId( 0 )
, m_dwMonId( 0 )
{
}CChangeMonitor::~CChangeMonitor( void )
{
EndMoniter();
}BOOL CChangeMonitor::StartMoniter( DWORD dwMonId, HWND hWnd )
{
// 判断是否已经启动监视
if ( NULL != m_hThread )
{
SetLastError( ERROR_NOTIFY_ALREADY_START );
TRACE_ERROR( GetLastError() );
return FALSE;
}
// 检查参数
if ( NULL == hWnd )
{
SetLastError( ERROR_INVALID_PARAMETER );
TRACE_ERROR( GetLastError() );
return FALSE;
}
m_dwMonId = dwMonId;
m_hWnd = hWnd;
// 创建监视线程
m_hThread = CreateThread( NULL, 0, ChangeMonitorThread,
(LPVOID)this, CREATE_SUSPENDED, &m_dwThreadId );
ASSERT( NULL != m_hThread );
return TRUE;
}void CChangeMonitor::EndMoniter( void )
{
// 判断线程是否存在
if ( m_hThread )
{
// 判断线程是否结束
DWORD dwExitCode;
VERIFY( GetExitCodeThread( m_hThread, &dwExitCode ) );
if ( STILL_ACTIVE == dwExitCode )
{
ASSERT( m_dwThreadId != 0 );
// 向线程发送退出消息
VERIFY( PostThreadMessage( m_dwThreadId, WM_MONITER_EXIT, 0, 0 ) );
// 使线程继续,以便结束
Resume();
// 等待线程退出
DWORD dwWaitResult = WaitForSingleObject( m_hThread, INFINITE );
ASSERT( WAIT_FAILED != dwWaitResult );
// 如果等待超时,强制结束线程
if ( WAIT_TIMEOUT == dwWaitResult )
{
if ( FALSE == TerminateThread( m_hThread, 0 ) )
{
TRACE_ERROR( -1 );
}
}
}
// 关闭线程句柄,将线程相关数据置零
VERIFY( CloseHandle( m_hThread ) );
m_hThread = NULL;
m_dwThreadId = 0;
}
m_hWnd = NULL;// 通知窗体置零
}void CChangeMonitor::Pause( void )
{
ASSERT( m_hThread );
SuspendThread( m_hThread );
}void CChangeMonitor::Resume( void )
{
ASSERT( m_hThread );
ResumeThread( m_hThread );
}void CChangeMonitor::SendNotify( UINT nMsg )
{
// 检查通知窗体句柄是否存在
ASSERT( m_hWnd != NULL );
// 发送通知消息
if ( FALSE == PostMessage( m_hWnd, nMsg, m_dwMonId, 0 ) )
{
TRACE_ERROR( GetLastError() );
}
}DWORD CALLBACK ChangeMonitorThread( LPVOID pParam )
{
// 检查参数是否为空
ASSERT( pParam != NULL );
// 得到监视器类对象指针
CChangeMonitor *pChaMon = (CChangeMonitor*)pParam;
// 检查对象
ASSERT( pChaMon->m_hThread != NULL );
ASSERT( pChaMon->m_hWnd != NULL );
ASSERT( pChaMon->m_dwThreadId != 0 );
// 进入线程消息循环
MSG msg;// 消息数据结构
while( FALSE == PeekMessage( &msg, NULL, WM_MONITER_EXIT,
WM_MONITER_EXIT, PM_REMOVE ) )
{
// 以0超时等待通知,直接返回等待结果
DWORD dwWaitResult = pChaMon->WaitNotify();
ASSERT( dwWaitResult != WAIT_FAILED );
switch( dwWaitResult )// 处理等待结果
{
case WAIT_OBJECT_0:// 通知已接收
// 向接收者发送通知消息
pChaMon->SendNotify( WM_MONITER_CHANGED );
// 继续下一次等待
pChaMon->CallNextMoniter();
break;
case WAIT_TIMEOUT:
break;
}
Sleep( 50 );
}
return 0;
}
// CDirectoryMonitor// 构造函数
CDirectoryMonitor::CDirectoryMonitor( void )
: m_hNotify( NULL )
{
}// 析构函数
CDirectoryMonitor::~CDirectoryMonitor( void )
{
}// 启动监视
BOOL CDirectoryMonitor::StartMoniter( DWORD dwMonId, HWND hWnd, LPCTSTR lpPath,
BOOL bSubTree, DWORD dwFilter )
{
// 调用父类同名函数
if ( FALSE == CChangeMonitor::StartMoniter( dwMonId, hWnd ) )
{
return FALSE;
}
// 创建监视
m_hNotify = FindFirstChangeNotification( lpPath, bSubTree, dwFilter );
if ( INVALID_HANDLE_VALUE == m_hNotify )
{
m_hNotify = NULL;
EndMoniter();
TRACE_ERROR( GetLastError() );
return FALSE;
}
// 启动监视线程
VERIFY( ResumeThread( m_hThread ) );
return TRUE;
}void CDirectoryMonitor::EndMoniter( void )
{
// 调用父类同名函数
CChangeMonitor::EndMoniter();
// 判断通知句柄是否存在
if ( m_hNotify )
{
// 结束通知
VERIFY( FindCloseChangeNotification( m_hNotify ) );
m_hNotify = NULL;// 通知句柄置零
}
}void CDirectoryMonitor::CallNextMoniter( void )
{
VERIFY( TRUE == FindNextChangeNotification( m_hNotify ) );
}DWORD CDirectoryMonitor::WaitNotify( void )
{
return WaitForSingleObject( m_hNotify, 0 );
}///////////////////////////////////////////////////////////////////////////////
// CRegistryMonitor// 构造函数
CRegistryMonitor::CRegistryMonitor( void )
: m_hKey( NULL )
, m_hNotify( NULL )
, m_dwFilter( 0 )
{
}// 析构函数
CRegistryMonitor::~CRegistryMonitor( void )
{
}// 启动监视
BOOL CRegistryMonitor::StartMoniter( DWORD dwMonId, HWND hWnd, HKEY hRoot,
LPCTSTR lpSubKey, DWORD dwFilter )
{
// 调用父类同名函数
if ( FALSE == CChangeMonitor::StartMoniter( dwMonId, hWnd ) )
{
return FALSE;
}
// 成员数据赋值
m_dwFilter = dwFilter;
// 打开注册表键
LONG lr;
lr = RegOpenKeyEx( hRoot, lpSubKey, 0, KEY_NOTIFY, &m_hKey );
if ( ERROR_SUCCESS != lr )
{
TRACE_ERROR( lr );
return FALSE;
}
// 创建通知事件句柄
m_hNotify = CreateEvent( NULL, FALSE, FALSE, NULL );
ASSERT( NULL != m_hNotify );
// 开始监视
CallNextMoniter();
// 启动监视线程
VERIFY( ResumeThread( m_hThread ) );
return TRUE;
}// 结束监视
void CRegistryMonitor::EndMoniter( void )
{
CChangeMonitor::EndMoniter();
if ( m_hNotify )
{
VERIFY( CloseHandle( m_hNotify ) );
m_hNotify = NULL;
}
if ( m_hKey )
{
VERIFY( ERROR_SUCCESS == RegCloseKey( m_hKey ) );
m_hKey = NULL;
}
}void CRegistryMonitor::CallNextMoniter( void )
{
ASSERT( m_hKey != NULL );
ASSERT( m_hNotify != NULL );
// 创建监视句柄
VERIFY( ERROR_SUCCESS == RegNotifyChangeKeyValue( m_hKey, TRUE,
m_dwFilter, m_hNotify, TRUE ) );
}DWORD CRegistryMonitor::WaitNotify( void )
{
return WaitForSingleObject( m_hNotify, 0 );
}
少了三个define,加到头文件里就行了#define WM_MONITER( WM_USER + 1000 )
#define WM_MONITER_EXIT( WM_MONITER + 1 )
#define WM_MONITER_CHANGED( WM_MONITER + 2 )
忘了说用法了CDirectoryMonitor是用来监控文件夹
CRegistryMonitor用来监控注册表键以CDirectoryMonitor为例CDirectoryMonitor DirNotify;
DirNotify.StartMoniter( 给一个ID, 用来接收消息的窗体句柄,你要监控的文件夹 );在窗体里响应WM_MONITER_CHANGED事件,当WM_MONITER_CHANGED发送,就代表文件夹被改动了