Windows C++ 监控共享文件夹变化

本文介绍了如何在Windows环境下,使用C++通过Win32 API来监控共享文件夹的变化。首先获取共享文件夹路径,接着通过RegNotifyChangeKeyValue监控注册表变化,再利用ReadDirectoryChangesW函数监控文件夹内文件的修改、添加、删除和重命名事件。这种方法能全面捕捉文件变化,但存在单线程监控限制和消息处理延迟等问题。
摘要由CSDN通过智能技术生成

最近由于项目需求,需要编写一个监控本机共享文件夹的变化的模块,经过查询资料,找到并实现了一个较为稳定的方式
项目实现是使用Win32 C++的,测试平台是Win 7 64和Win 10 64,XP测试也是好使的。下面是具体实现

首先要获取并监控系统共享文件夹的路径,相关注册表路径为 HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\LanmanServer\Share ,他的值的格式为如图所示,

类型为 REG_MULTI_SZ, 所以我们需要枚举获取所有类型为REG_MULTI_SZ的项。然后它的值的具体内容如图所示,

我们可以看的项为Path=E:\ShareTest 里就有我们所需要的共享文件夹路径,所以获取共享文件夹路径的就可以开始编写了,具体实现如下。

BOOL GetSharedFoldersList(map<CString, HANDLE> &theList)
{
	BOOL bFlag = FALSE;
	HKEY hKey = NULL;
	do
	{
		//清空列表
		theList.clear();

		//HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\LanmanServer\Share
		//通过注册表获取共享文件夹列表
		HKEY rootKey = REG_SHARE_KEY;
		CString szRegPath = REG_SHARE_PATH;
		
		int ErrCode;
		if (ERROR_SUCCESS != (ErrCode = RegOpenKeyEx(rootKey, szRegPath, 0, KEY_READ | KEY_WOW64_64KEY, &hKey)))
		{
			break;
		}

		TCHAR szValue[MAX_VALUE_NAME] = { 0 };
		DWORD dwValueSize = MAX_VALUE_NAME;
		int index = 0;
		DWORD dwBufferSize = 255;
		DWORD dwType;
		TCHAR *szValBuffer = NULL;
		DWORD dwSize;
		while (ERROR_NO_MORE_ITEMS != RegEnumValue (
			hKey, index, szValue, &dwValueSize, NULL, &dwType, NULL, &dwBufferSize))
		{
			//判断值类型
			switch(dwType)
			{
				//只找多个串的值
			case REG_MULTI_SZ:
				{
					dwSize = dwBufferSize + 1;
					szValBuffer = new TCHAR[dwSize];
					ZeroMemory(szValBuffer, dwSize);
					if (ERROR_SUCCESS != RegQueryValueEx(hKey, szValue, 0, &dwType, (LPBYTE)szValBuffer, &dwBufferSize))
					{
						break;
					}
					int j = 0;

		
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值