文件监视

#include <Windows.h>
#include <tchar.h>
#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;

int main()
{
	char str2[1024];

	//监控主文件夹变化
	string dir = "f:\\test\\";
	char notify[1024];
	memset(notify, 0, 1024);
	DWORD cbBytes; 
	FILE_NOTIFY_INFORMATION *pNotify=(FILE_NOTIFY_INFORMATION *)notify;
	char strNameOld[MAX_PATH],strNameNew[MAX_PATH];
	BOOL bReName = FALSE;


	HANDLE dwRootDirChangeHandle = CreateFileA( 
		dir.c_str(), /* pointer to the file name */
		FILE_LIST_DIRECTORY,                /* (this is important to be FILE_LIST_DIRECTORY!) access (read-write) mode */
		FILE_SHARE_WRITE | FILE_SHARE_READ | FILE_SHARE_DELETE,  /* (file share write is needed, or else user is not able to rename file while you hold it) share mode */
		NULL, /* security descriptor */
		OPEN_EXISTING, /* how to create */
		FILE_FLAG_BACKUP_SEMANTICS, /* file attributes */
		NULL /* file with attributes to copy */
		);

	if (dwRootDirChangeHandle == INVALID_HANDLE_VALUE)
	{
		printf("error: %d", GetLastError());
		return 0;
	}

	while ( 1 )
	{	

		if(ReadDirectoryChangesW(dwRootDirChangeHandle, ¬ify, sizeof(notify),
			TRUE, 
			FILE_NOTIFY_CHANGE_FILE_NAME|//重命名
			FILE_NOTIFY_CHANGE_DIR_NAME|//更改子目录名称
			FILE_NOTIFY_CHANGE_ATTRIBUTES|//更该文件属性
			FILE_NOTIFY_CHANGE_SIZE|//更改文件大小
			FILE_NOTIFY_CHANGE_LAST_WRITE|//最后更改时间
			FILE_NOTIFY_CHANGE_LAST_ACCESS|//最后访问时间
			FILE_NOTIFY_CHANGE_CREATION|//修改创建时间
			FILE_NOTIFY_CHANGE_SECURITY,//修改安全属性
			&cbBytes, 
			NULL,
			NULL))
		{			
			if(!bReName)
			{
				memset(strNameOld, 0, MAX_PATH);
			}
			memset(strNameNew, 0, MAX_PATH);

			WideCharToMultiByte( CP_ACP,0,pNotify->FileName, pNotify->FileNameLength/2, strNameNew,MAX_PATH / 2,NULL,NULL );

			switch(pNotify->Action)
			{
			case FILE_ACTION_ADDED:
				printf("New Folder: %s\n", strNameNew);
				break;
			case FILE_ACTION_MODIFIED:
				if(bReName){
					printf("old name %s, new name %s.\n",strNameOld, strNameNew);
					bReName = FALSE;
				}
				else{
					printf("modified name %s\n", strNameNew);
				}
				break;
			case FILE_ACTION_REMOVED:
				printf("The file was removed from the directory. %s \n",strNameNew);
				break;
			case FILE_ACTION_RENAMED_NEW_NAME:
				printf("The file was renamed and this is the new name. %s \n",strNameNew);
				break;
			case FILE_ACTION_RENAMED_OLD_NAME:
				printf("The file was renamed and this is the old name %s.\n", strNameNew);
				bReName = TRUE;
				break;
			default:
				printf("Unknown command.\n");
			}		

			if( 0 != pNotify->NextEntryOffset  && (pNotify->FileNameLength > 0 && pNotify->FileNameLength < MAX_PATH))
			{
			PFILE_NOTIFY_INFORMATION p = (PFILE_NOTIFY_INFORMATION)((char*)pNotify+pNotify->NextEntryOffset);
			memset( str2, 0, sizeof(str2) );
			WideCharToMultiByte( CP_ACP,0,p->FileName,p->FileNameLength/2,str2,99,NULL,NULL );
			cout << str2 << endl;
			}

			if(bReName)
			{
				memcpy(strNameOld, strNameNew, MAX_PATH);
			}
		}
	}
	::CloseHandle(dwRootDirChangeHandle);

	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值