加载中…
个人资料
一去二三里
一去二三里
  • 博客等级:
  • 博客积分:0
  • 博客访问:2,847,109
  • 关注人气:909
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

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

(2012-09-03 18:43:44)
标签:

文件监控

filesystemwatcher

c

详解

分类: 编程

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

 

#using

#include

#include

#include

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::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++详解)


注:
    技术在于交流、沟通,转载请注明出处并保持作品的完整性。

 

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有