如何实现文件和文件夹的监控功能

分析问题

  FileSystemWatcher类型定义在System.IO命名空间下,它的功能是监控某个文件夹下特定文件系统的变化。这样的变化可以包括创建、文件修改、重命名、删除等。程序员可以通过设置一个NotifyFilters枚举类型的成员来订阅感兴趣的信息。下表列出了NotifyFilters的所有项及其代表的意义。

名称 说明 长度
Attributes 文件或文件夹的属性 4
CreationTime 文件或文件夹的创建时间 64
DirectoryName 目录名 2
FileName 文件名 1
LastAccess 文件或文件夹上一次打开的日期 32
LastWrite 上一次向文件或文件夹写入内容的日期 16
Security 文件或文件夹的安全设置 256
Size 文件或文件夹的大小 8

  程序员通过设置感兴趣的文件夹和文件、变化的类型以及处理时间的方法,就能实现对文件系统的侦听。以下代码展示了FileSystemWatcher的使用方法。

说明

  .NET中的事件机制将在本书后续章节中有所覆盖,简单来说,事件代表一个可以触发回调方法的特殊类型。

using System;
using System.IO;

namespace Test
{
    class UseFileSystemWatcher
    {
        //退出程序命令
        private const string Exit = "exit";
        //监视的文件夹
        private const string Folder = @"D:\Test";

        private FileSystemWatcher _fsw;

        public UseFileSystemWatcher()
        {
            _fsw = new FileSystemWatcher();
            //建立监测文件夹
            if (Directory.Exists(Folder))
            {
                Directory.Delete(Folder, true);
            }
            Directory.CreateDirectory(Folder);
            _fsw.Path = Folder;
            //这里选择最后访问文件时间、最后写文件时间、文件名、
            //文件夹名变化时,触发事件
            _fsw.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName;
            //这里选择监测所有的zip文件
            _fsw.Filter = "*.rar";
            //为这些事件添加处理方法。
            _fsw.Changed+=new FileSystemEventHandler(OnChanged);
            _fsw.Created+=new FileSystemEventHandler(OnChanged);
            _fsw.Deleted+=new FileSystemEventHandler(OnChanged);
            _fsw.Renamed += new RenamedEventHandler(OnRenamed);
            //这里开始所有事件会被触发
            _fsw.EnableRaisingEvents = true;

        }
        //处理变化事件,变化可以包含创建、修改和删除
        private void OnChanged(object source, FileSystemEventArgs e)
        {
            Console.WriteLine("文件:{0}{1}", e.FullPath, e.ChangeType.ToString());
        }
        //处理重命名事件
        private static void OnRenamed(object source, RenamedEventArgs e)
        {
            Console.WriteLine("文件:{0}重命名为:{1}",e.OldFullPath,e.FullPath);
        }

        static void Main()
        {
            try
            {
                UseFileSystemWatcher ws = new UseFileSystemWatcher();
                while (Console.ReadLine()!=Exit)
                {

                }
            }
            finally
            {
                //清理测试数据
                if (Directory.Exists(Folder))
                {
                    Directory.Delete(Folder, true);
                }
            }
        }
    }
}

  以上代码创建了一个监测D:\Test目录的FileSystemWatcher对象,并且订阅了感兴趣的修改、创建、删除等事件。在程序运行过程中,读者可以尝试在D:\Test目录下创建、删除、复制文件,控制台会输出相应的信息,最后使用者可以输入exit来结束这段程序的运行。

  关于FileSystemWatcher产生的最多疑问可能就是文件复制时Changed事件为何被多次触发。这并不是.NET的Bug,而是正常文件系统操作中确实包含了多个简单操作。例如一个移动操作,可能涉及多次修改文件的操作,并且可能产生文件的创建和删除动作。

注意

  某些特殊的监控软件,例如防火墙软件等,都可能会导致FileSystemWatcher监控事件的发生。

  虽然FileSystemWatcher使用非常简单,但在设计使用FileSystemWatcher的系统时仍需要注意其某些细节。FileSystemWatcher会维护一个内部缓冲来接受文件系统的修改通知,但短时间内文件系统的修改数量过多时,缓冲就会溢出,这时候就会导致某些修改事件被丢失。程序员可以通过InternalBufferSize来修改内部缓存的大小。

技巧

  笔者不建议读者随意加大FileSystemWatcher的内部缓存大小,因为这对性能的影响非常大。笔者建议读者使用其他机制来避免文件修改事件的丢失,比如加快处理速度、减少监控范围等。

答案

  .NET提供了FileSystemWatcher类型来实现文件系统的监控。程序员通过设置监控目录、监控类型和回调方法,就可以方便地实现监控的功能。但需要小心FileSystemWatcher缓存溢出的情况。

  

如何实现文件和文件夹的监控功能

时间: 2024-10-26 16:37:34

如何实现文件和文件夹的监控功能的相关文章

.NET基础 (14)管理文件和文件夹的类型

管理文件和文件夹的类型1 如何操作文件和文件夹2 如何实现文件和文件夹的监控功能 管理文件和文件夹的类型1 如何操作文件和文件夹 .NET内建类中提供了FileInfo和DictionaryInfo两个类型,分别用来操作文件和文件夹.有别于File和Dictionary类型.FileInfo和DictionaryInfo主要的功能在于操作文件和文件夹在文件系统中的结构,完成诸如创建.复制.读取信息.移动.判断是否存在.删除等功能. 示例: class UseDirectoryInfo { sta

对SD卡中的文件与文件夹进行监控

Android系统API提供了FileObserver抽象类(Linux的INotify机制)来监听系统/sdcard中的文件或文件夹,FileObserver类能对sdcard中的文件及文件夹的打开.创建.移动和删除操作进行监控.下面看看代码实现: //设置所要监控的文件或文件夹 mFileObserver = new SDCardFileObserver(Environment.getExternalStorageDirectory().getPath()); //开始监听 mFileObs

linux 系统监控某目录下文件及文件夹的变化

inotifywait 是一个可以实时监控文件变动的工具,它利用linux内核中的inotify机制实现监控功能. 查看内核版本 [[email protected]Oracle ~]# uname -r 2.6.32-220.el6.i686 安装inotify-tools yum install -y inotify-tools 测试监控/etc,inotifywait -m /etc 用putty连接服务器,开启另一个终端,用vim编辑/etc/passwd时,另一个终端显示对应的监控信息

文件及文件夹更改通知/监测软件TheFolderSpy

TheFolderSpy是Windows环境下一个监测文件(夹)更改,删除,创建,重命名的绿色免安装小软件,并在文件及文件夹有更改时发送Email通知管理者 该软件使用.Net开发,所以需要安装.Net FrameWork环境,有图有真相 1.监控的文件(夹)列表 2.编辑或添加文件(夹),监控更改,删除,创建,重命名等操作,并发送Email通知 3.自定义发送Email通知,当文件(夹)有更改时会发送email 文件(夹)日志列表 softpedia.com上的说明: An efficient

删除除了匹配到的所有文件以及文件夹

在linux应用中经常用到 rm 有时候只想删除除了匹配到的所有文件以及文件夹. 解决方法一:自己写一个脚本. 方法二:Bash Shell有个extglob选项,开启之后Shell可以另外识别出5个模式匹配操作符,能使文件匹配更加方便. 开启方法很简单,使用shopt命令:shopt -s extglob 开启之后,以下5个模式匹配操作符将被识别: ?(pattern-list) - 所给模式匹配0次或1次: *(pattern-list) - 所给模式匹配0次以上包括0次:+(pattern

Linux服务器删除乱码文件和文件夹的方法

Linux服务器删除乱码文件和文件夹的方法 首页进入乱码文件所在文件夹由于php大势所趋,所以接触Linux服务器的机会越来越多.不同于Windows服务器,Linux服务器只支持数字.英文等字符,对中文字符没办法识别.所以导致我们打包上传文件解压之后出现中文乱码文件和文件夹.网上有很多解决的办法,但是今天亲测用find命令能快速删除乱码的文件和文件夹,所以跟大家分享一下. 使用ls -i命令找到文件或文件夹的节点编号 前面的就是节点号了,接下来使用find命令查询并且删除 -inum指根据节点

无法删除 NTFS 盘上的文件或文件夹(对Windows文件的各种情况有比较详细的描述)

简介 本文介绍您可能无法删除 NTFS 文件系统卷上的文件或文件夹的原因,以及如何分析造成此问题的不同原因从而解决此问题. 更多信息 注意:在内部,NTFS 将文件夹作为特殊类型的文件进行处理.因此,本文中的“文件”一词可能指文件,也可能指文件夹. 原因 1:文件使用了 ACL 如果某个文件使用了访问控制列表 (ACL),您可能无法删除该文件.要解决此问题,请更改该文件上的权限.您可能需要拥有这些文件的所有权才能更改权限. 管理员具有取得任何文件所有权的隐含能力,即使未明确向他们授予针对此文件的

git小技巧--如何从其他分支merge个别文件或文件夹

在实际工作中,一个大型的项目或版本迭代可能不是一次上线,可能会分好几次上线,这时候就会涉及创建多个分支,进行分别开发. 创建分支 功能分为2个分支,分别为A.B. A上面有个列表页功能 B上面有个详情页功能,还有个系统消息功能 产品经理说先上列表功能,于是我们就开发A分支,列表功能很快开发完成. 第二天按常理开发B分支,开发到一半,产品经理说目前的系统消息功能需要急着上线,要和列表功能一起上线,当时就懵逼了,然后赶紧放下详情页的开发,立马去开发系统消息功能,开发完之后需要将列表功能和系统消息功能

php如何判断一个是文件还是文件夹

除了file_exsits() 之外 文件函数我们还有用到很多.不指判断 是否有文件, 还可以判断 是否为文件夹或文件  用于日常 图片显示 很有用, 如果判断 图片是否存在, 如果 不存在就显示 默认图等.. php判断文件还是文件夹主要通过is_file跟is_dir函数判断,下面分别讲解: is_file()函数 is_file()函数 用来判断是否为文件,返回结果为true或者false 举例: $ifile="c:/test"; $result=is_file($ifile)