监测目录活动

原创 2006年05月24日 08:44:00
监测目录活动 【转】
C# 中有类 FileSystemWatcher 不但能够知道指定目录树中的文件/目录的改变,而且能够知道是哪个文件/目录在改变,而我用FindFirstChangeNotification等Win API 却不能实现第二个功能,虚耗了不少时间,昨日在msdn中发现 ReadDirectoryChangesW 是可行的,特封装一下,请大家斧正。

#define _WIN32_WINNT 0x0500

#include <windows.h>
#include <string>
#include <cassert>

enum ACTION { ADDED=1, REMOVED=2, MODIFIED=3, RENAMED=4 };
class FileSystemWatcher
{
public:
typedef void (__stdcall *LPDEALFUNCTION)( ACTION act, std::string filename1, std::string filename2 );

bool Run( std::string path, LPDEALFUNCTION dealfun )
{
WatchedDir = path;
DealFun = dealfun;

DWORD ThreadId;
hThread=CreateThread( NULL,0,Routine,this,0,&ThreadId );
return NULL!=hThread;
}
void Close()
{
if( NULL != hThread )
{
TerminateThread( hThread, 0 );
hThread = NULL;
}
if( INVALID_HANDLE_value != hDir )
{
CloseHandle( hDir );
hDir = INVALID_HANDLE_value;
}
}
FileSystemWatcher() : DealFun(NULL), hThread(NULL), hDir(INVALID_HANDLE_value)
{
}
~FileSystemWatcher()
{
Close();
}

private:
std::string WatchedDir;
LPDEALFUNCTION DealFun;
HANDLE hThread;
HANDLE hDir;
private:
FileSystemWatcher( const FileSystemWatcher& );
FileSystemWatcher operator=( const FileSystemWatcher );
private:
static DWORD WINAPI Routine( LPVOID lParam )
{
FileSystemWatcher* obj = (FileSystemWatcher*)lParam;

obj->hDir = CreateFile(
obj->WatchedDir.c_str(),
GENERIC_READ|GENERIC_WRITE,
FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE,
NULL,
OPEN_EXISTING,
FILE_FLAG_BACKUP_SEMANTICS,
NULL
);
if( INVALID_HANDLE_value == obj->hDir ) return false;

char buf[ 2*(sizeof(FILE_NOTIFY_INFORMATION)+MAX_PATH) ];
FILE_NOTIFY_INFORMATION* pNotify=(FILE_NOTIFY_INFORMATION *)buf;
DWORD BytesReturned;
while(true)
{
if( ReadDirectoryChangesW( obj->hDir,
pNotify,
sizeof(buf),
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,
&BytesReturned,
NULL,
NULL ) )
{
char tmp[MAX_PATH], str1[MAX_PATH], str2[MAX_PATH];
memset( tmp, 0, sizeof(tmp) );
WideCharToMultiByte( CP_ACP,0,pNotify->FileName,pNotify->FileNameLength/2,tmp,99,NULL,NULL );
strcpy( str1, tmp );

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

obj->DealFun( (ACTION)pNotify->Action, str1, str2 );
}
else
{
break;
}
}

return 0;
}
};

以下是测试代码 #include <conio.h>
#include <iostream>
using namespace std;

void __stdcall MyDeal( ACTION act, std::string filename1, std::string filename2 )
{
switch( act )
{
case ADDED:
cout << "Added - " << filename1 << endl;
break;
case REMOVED:
cout << "Removed - " << filename1 << endl;
break;
case MODIFIED:
cout << "Modified - " << filename1 << endl;
break;
case RENAMED:
cout << "Rename - " << filename1 << " " << filename2 << endl;
break;
}
}

void main()
{
FileSystemWatcher a;
a.Run( "D://", MyDeal );

cout << "Watch D://" << endl;
cout << "Press <q> to quit." << endl;
while(getch()!='q');

a.Close();
}

 

[AD]举例介绍活动目录的优势

Active Directory服务提供了单一登入的能力和一个所有基础设施相关信息的集中储存机制,大幅度的简化了使用者和计算机的管理,同时提供优越的网络资源存取能力。我在本文中主要讲述一下Micros...
  • kepa520
  • kepa520
  • 2015年07月23日 13:35
  • 1271

DNS、活动目录、域

DNS: 域名服务,作用是将网络域名解析成IP地址 活动目录: 微软提供的目录服务的一种,它存储有关网络上的对象信息,并使管理员和用户更方便的查找和使用这类信息 域: 网络系统的一...
  • lluozh2015
  • lluozh2015
  • 2015年10月12日 21:18
  • 379

活动目录是做什么用的

随着windows ad活动目录域在企业中应用的越来越广泛,很多朋友会询问活动目录的作用及功能,活动目录域管理技术的好处,怎样管理域,域管理方案教程等等,诸如此类的问题越来越多。其实,企业实施活动目录...
  • gnaw0725
  • gnaw0725
  • 2015年06月19日 09:09
  • 2479

在Windows XP 中使用Active Directory(活动目录)

http://www.aiview.com/2005/10/windows_xp_active_directory.html 在Windows XP 中使用Active Directory(活动...
  • caolaosanahnu
  • caolaosanahnu
  • 2013年01月04日 13:27
  • 1091

[转贴]AD活动目录问题总结

1.客户端xp添加不了到myad.com,要不就是dns没有设置正确,要不就是services.msc服务中没有开启TCP/IP NetBIOS Helper. 2.ou是组织单元的简称,为了方便管...
  • u014461454
  • u014461454
  • 2014年03月31日 17:53
  • 439

java代码LDAP操作(增删改查)AD(活动目录)- 搜索

搜索用户 package cn.com.wilcom.main; import java.util.Hashtable; import javax.naming.Context; import ja...
  • fansenjun
  • fansenjun
  • 2016年11月21日 11:11
  • 771

转储活动目录数据库凭证的方法总结

原文地址: https://adsecurity.org/?p=2398 0x00 前言 ADS 的大牛发表的文章都堪称佳作,值得仔细拜读,遂花了点时间对全文进行了翻译,以飨各位。 我之...
  • qq_27446553
  • qq_27446553
  • 2016年01月13日 16:02
  • 897

活动目录架构主机转移操作

第六章电子实验报告 操作主机     1.    转移制操作主机角色, (1)在任何的的一台域控制器上运行“regsvr32 schmmgmt . dll”显示构架管理工具已经注册成功。(如下图) ...
  • zjc801
  • zjc801
  • 2015年08月14日 10:39
  • 791

Go监控目录变化小程序.

package main import ( "flag" "log" "os/exec" "strings" "sync" "time" "github.com/go-fsnotif...
  • fyxichen
  • fyxichen
  • 2015年10月16日 09:33
  • 784

杀京东价格监控软件项目开发日志

杀京东 做最走心的京东价格监控软件 免费开源的价格监控软件 欢迎加入QQ群415014949一起讨论...
  • 36
  • 36
  • 2016年03月15日 17:25
  • 1469
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:监测目录活动
举报原因:
原因补充:

(最多只允许输入30个字)