现在的位置: 首页 > 综合 > 正文

文件监控之FileSystemWatcher(C++…

2014年03月03日 ⁄ 综合 ⁄ 共 2869字 ⁄ 字号 评论关闭


   这些天在研究一些文件监控方面的知识,把自己积累的一些小知识拿出来和大家分享一下,为了能让更多的人能够更容易看明白,我特意加了一些注释,不算很详细,但是理解起来应该更轻松一点,希望各位大虾多多指正。。。技术在于交流嘛!文件监控之FileSystemWatcher(C++详解)如果希望能多了解一些文件监控方面的知识,请参考我的另一篇文章——文件监控之ReadDirectoryChangesW(C++详解)。


 


#using

<system.dll>


#include

<string.h>


#include

<atlstr.h>


#include

<iostream>


using

namespace System;


using

namespace System::IO;


 


ref

class FSEventHandler


{


    
private:


        
static int count = 0;


        
void OnChanged (Object^ source,
FileSystemEventArgs^ e)


        
{


             
//
当文件改变、创建、或者删除时执行的动作(count用于批量监控,可以测试由于粘贴大批量文件而是否引发监测漏洞问题)


             
Console::WriteLine("{0}  
File:{1}  
ChangeType:{2}"
,


             
++count, e->FullPath,
e->ChangeType, 
e->Name);


        
}


        
void OnRenamed(Object^ source,
RenamedEventArgs^ e)


        
{


             
//
定义文件重命名时执行的动作


             
Console::WriteLine("{0}  
File:{1}  
renamed to:{2}"
,


           
++count, e->OldFullPath,
e->FullPath);


        
}


    
public:


        
int static run()


        
{


             
//
创建一个FileSystemWatcher并设置它的属性.


             
FileSystemWatcher^ fsWatcher = gcnew FileSystemWatcher( );


             
fsWatcher->Path = "E:\\wang";


             


             
//
设置缓冲区大小1M,根据需求设置


             
fsWatcher->InternalBufferSize = 1048576;


             


             
//
监听文件、目录、文件大小的改变


             
fsWatcher->NotifyFilter = static_cast<NotifyFilters>


                  
(NotifyFilters::FileName |


             
 
NotifyFilters::DirectoryName |


             
 
NotifyFilters::Size);


 


             
//
监听子目录


             
fsWatcher->IncludeSubdirectories = true;


             


             
//
添加事件处理程序


             
FSEventHandler^ handler = gcnew
FSEventHandler();


             
fsWatcher->Changed += gcnew FileSystemEventHandler(


                  
handler, &FSEventHandler::OnChanged);


             
fsWatcher->Created += gcnew FileSystemEventHandler(


                  
handler, &FSEventHandler::OnChanged);


             
 fsWatcher->Deleted
+= gcnew
FileSystemEventHandler(


                      
handler, &FSEventHandler::OnChanged);


             
fsWatcher->Renamed += gcnew RenamedEventHandler(


                      
handler, &FSEventHandler::OnRenamed);


 


             
//
开始监听


             
fsWatcher->EnableRaisingEvents = true;


 


             
Console::WriteLine("Press Enter to
quit the sample."
);


             
Console::ReadLine();


             
return 0;


        
}


};


 


int

main()


{ 


    
FSEventHandler::run();  


}


 


注意事项(步骤):


1
、创建FileSystemWatcher,并设置它的属性(例如:设置监控的目录就需设置Path属性,设置缓冲区大小就需设置InternalBufferSize属性)。


2
、根据需求适当设置缓冲区大小,否则有可能会因大批量文件造成监控遗漏问题(例:同时复制或者删除1000个文件,可能只检测到500600个)。InternalBufferSize属性用于获取或设置内部缓冲区的大小,默认值为40964KB)。内部缓冲区用来存储监视到的更改信息。如果短时间内更改过多,则缓冲区会发生溢出,导致某些监视到的更改数据丢失。但是增加缓冲区大小,会使系统的运行开销增大,因此,适当设置缓冲区大小,若要避免缓冲区溢出,则使用NotifyFilterIncludeSubdirectories属性筛选掉不想要的更改通知,如果内部缓冲区溢出,组件将引发Error事件。


3
、指定在文件、文件夹中监听的更改(例:NotifyFilters::FileName
| 
NotifyFilters::DirectoryName |
NotifyFilters::Size
监听文件、目录、文件大小的改变)


4
、监听子目录,设置fsWatcher->IncludeSubdirectories
= true;


5
、添加事件处理程序,主要包括:ChangedCreateDeleteRanamed 

 


以下为我将InternalBufferSize的大小设置为1M的时候监听同时删除12000个文本文档的截图,



文件监控之FileSystemWatcher(C++详解)

 




文件监控之FileSystemWatcher(C++详解)

抱歉!评论已关闭.