FileMonitor






4.82/5 (10投票s)
2000年4月18日

189486

7382
一个用于监视您的目录和/或文件更新、创建和删除的 ATL 控件
引言
该项目使您可以监视您的目录和/或您的文件。 每当创建、更新或删除文件或子目录时,控件将生成一个事件。
如果您想知道如何在 MFC 应用程序中使用此控件,请查看页面:如何将 ATL 控件与 MFC 一起使用。
我用 Visual C++ 6.0 和 ATL 3.0 编写了这个项目,因为您不能在 Visual Basic 中使用多线程。
属性
名称 | 类型 | 读/写 | 描述 |
Start |
布尔值 | 读/写 |
当设置为 如果监视器已启动,则返回 |
方法
名称 | Returns | 参数 | 描述 |
AddPath |
/ | ByVal sPathName as String |
添加用于监视的目录。 |
RemovePath |
/ | ByVal sPathName as String |
删除目录。 |
事件
名称 | 参数 | 描述 |
Notify |
ByVal sPathName As String , ByVal nType As Integer |
通知控件文件 (nType = 1) 或子目录 (nType = 0) 在目录 sPathName 中被更改、删除或创建。 |
备注
建议您在开始监视之前先添加所有要监视的目录,因为当监视器正在运行时,添加新目录时,它将始终被停止并重新启动。
该控件已在 Windows NT 和 Windows 98 上进行了测试。
该控件使用 ATL 3.0 用 Visual C++ 6.0 编写。 该控件已使用 Visual Basic 6.0 进行了测试
资源
这些是我用来创建此项目的资源
因为我在这个控件中使用了多线程,并且无法从线程中触发事件,所以我使用了以下技巧来触发事件。
该控件被创建为一个窗口。 我将控件的指针传递给线程函数,在那里我可以使用控件的窗口句柄来发送消息。 此消息将被处理,并将触发事件到控件的容器。
class ATL_NO_VTABLE CWatch : public CWindowImpl<CWatch>, // The control is implemented as a window public CComObjectRootEx<CComSingleThreadModel>, public CComCoClass<CWatch, &CLSID_Watch>, public IConnectionPointContainerImpl<CWatch>, public IDispatchImpl<IWatch, &IID_IWatch, &LIBID_FILEMONITOR>, public CProxy_IWatchEvents< CWatch > { public: CWatch() { m_bStarted = false; m_hEvent = NULL; m_hThread = NULL; } deqString m_Paths; HANDLE m_hEvent; HANDLE m_hThread; DWORD m_dwThreadId; bool m_bStarted; cstring m_sNotify; DECLARE_WND_CLASS(TEXT("Watch")) BEGIN_MSG_MAP(CWatch) MESSAGE_HANDLER(WM_WATCH_NOTIFY, OnWatchNotify) // The messagehandler END_MSG_MAP() LRESULT OnWatchNotify(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL &bHandled) // Fires the Notify event { Fire_Notify(_bstr_t(m_sNotify.c_str()), wParam); return 0; } ... };
线程在 Start
方法中创建,如下所示
m_hThread = CreateThread(NULL, 0, ThreadFunc, (LPVOID) this, 0, &m_dwThreadId);
如您所见,我将 this
指针传递给 ThreadFunc
。
更新
- 2000 年 5 月 11 日 - 修复了
AddPath
方法中的一个错误 - 2000 年 12 月 12 日 - 主要变化是用于监视目录的线程仅创建一次。
过去,当您添加或删除路径时,会重新创建线程。 现在我使用一个事件来通知线程。 当线程收到事件时,它将自动刷新
FileNotifications
。访问 我的网站 以获取更新。