CFileWatch
这个类帮助你监控文件。如果文件在程序外部被修改,你会收到通知。

引言
这个类帮助你像在 DevStudio 中一样监控文件。如果文件在你的应用程序外部被修改,会弹出一个消息框,让你选择忽略修改或重新加载数据,从而丢弃所有更改。
如果文件被修改,消息会发送到指定的视图或指定文档的第一个视图。消息处理程序将调用文档类的重新加载函数。该类应该是线程安全的。
你需要在你的 View
类和 Document
类中进行更改
在你的文档类头文件中
class CFileWatchAppDoc : public CRichEditDoc
{
....
public:
void OnFileReload();
protected:
DWORD m_hFileWatch;
void AddToFileWatch();
};
在你的文档类源文件中
#include "FileWatch.h"
CFileWatchAppDoc::CFileWatchAppDoc()
{
m_hFileWatch = NULL;
}
CFileWatchAppDoc::~CFileWatchAppDoc()
{
CFileWatch::RemoveHandle(m_hFileWatch);
}
BOOL CFileWatchAppDoc::OnSaveDocument(LPCTSTR lpszPathName)
{
CFileWatch::RemoveHandle(m_hFileWatch);
BOOL bSuccess = CRichEditDoc::OnSaveDocument(lpszPathName);
AddToFileWatch();
return bSuccess;
}
void CFileWatchAppDoc::SetPathName(LPCTSTR lpszPathName, BOOL bAddToMRU)
{
CFileWatch::RemoveHandle(m_hFileWatch);
CRichEditDoc::SetPathName(lpszPathName, bAddToMRU);
AddToFileWatch();
}
void CFileWatchAppDoc::AddToFileWatch()
{
m_hFileWatch = CFileWatch::AddFileFolder(lpszPathName,
NULL, this);
CFileWatch::SetAutoReload(m_hFileWatch,
&((CYourApp*)AfxGetApp())->m_bAutoReloadDocTypeXY);
}
void CFileWatchAppDoc::OnFileReload()
{
// your reload code
...
UpdateAllViews(NULL);
}
在你的视图类头文件中
class CFileWatchAppView : public CRichEditView
{
...
protected:
//{{AFX_MSG(CFileWatchAppView)
afx_msg LRESULT OnFileWatchNotification(WPARAM wParam,
LPARAM lParam);
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
在你的视图类源文件中
#include "FileWatch.h"
BEGIN_MESSAGE_MAP(CFileWatchAppView, CRichEditView)
//{{AFX_MSG_MAP(CFileWatchAppView)
ON_REGISTERED_MESSAGE(CFileWatch::m_msgFileWatchNotify,
OnFileWatchNotification)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
LRESULT CFileWatchAppView::OnFileWatchNotification(WPARAM wParam,
LPARAM lParam)
{
CString sPathName = CString((LPCTSTR)lParam);
DWORD hFileWatch = (DWORD)wParam;
if (CFileWatch::Dialog(hFileWatch))
GetDocument()->OnFileReload();
return 0;
}
在你的主框架类源文件中
#include "FileWatch.h"
void CMainFrame::OnClose()
{
CFileWatch::Stop();
CMDIFrameWnd::OnClose();
}
将非文档文件添加到监控中
应该被监控的非文档文件可以添加到监控中,但必须与一个视图类关联。使用 DWORD dwData
或文件名来区分哪个文件被更改。
#include "FileWatch.h"
void class::xy()
{
...
DWORD hHandle = CFileWatch::AddFileFolder(LPCTSTR lpszFileName,
HWND hWnd, CDocument* pDocument=NULL, DWORD dwData);
...
}
LRESULT CYourView::OnFileWatchNotification(WPARAM wParam,
LPARAM lParam)
{
CString sPathName = CString((LPCTSTR)lParam);
DWORD dwData = (DWORD)wParam;
if (sPathName == GetDocument()->GetPathName())
GetDocument()->OnFileReload();
else
...
return 0;
}
注意
并非所有文件系统都以相同的方式记录写入时间。例如,在 Windows NT FAT 上,创建时间的分辨率为 10 毫秒,写入时间的分辨率为 2 秒,访问时间的分辨率为 1 天(实际上是访问日期)。在 NTFS 上,访问时间的分辨率为 1 小时。此外,FAT 在磁盘上以本地时间记录时间,而 NTFS 在磁盘上以 UTC 记录时间,因此不受时区或夏令时更改的影响。我没有关于 FAT 或 FAT32 中写入时间分辨率的信息。但是,如果文件在相同的时间窗口内被修改多次,则只能检测到一个通知!