65.9K
CodeProject 正在变化。 阅读更多。
Home

FileMonitor

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.82/5 (10投票s)

2000年4月18日

viewsIcon

189486

downloadIcon

7382

一个用于监视您的目录和/或文件更新、创建和删除的 ATL 控件

引言

该项目使您可以监视您的目录和/或您的文件。 每当创建、更新或删除文件或子目录时,控件将生成一个事件。

如果您想知道如何在 MFC 应用程序中使用此控件,请查看页面:如何将 ATL 控件与 MFC 一起使用

我用 Visual C++ 6.0 和 ATL 3.0 编写了这个项目,因为您不能在 Visual Basic 中使用多线程。

属性

名称 类型 读/写 描述
Start 布尔值 读/写

当设置为 true 时,监视器将开始监视目录。

如果监视器已启动,则返回 True。 如果未启动,则返回 False

方法

名称 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 进行了测试

资源

这些是我用来创建此项目的资源

  1. PRB:在第二个线程中触发事件会导致 IPF 或 GPF

因为我在这个控件中使用了多线程,并且无法从线程中触发事件,所以我使用了以下技巧来触发事件。

该控件被创建为一个窗口。 我将控件的指针传递给线程函数,在那里我可以使用控件的窗口句柄来发送消息。 此消息将被处理,并将触发事件到控件的容器。

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

    访问 我的网站 以获取更新。

© . All rights reserved.