由于接触C#不太久,请教各位高手,如何实现文件夹内针对特定文件的监控并报警功能。比如,D:\11文件夹内有许多不断生成的.txt文本文件,如果连续生成3个文件大小小于30kb的.txt文件就启动一段音乐程序用来发出警报。。在此先谢谢大家提供帮助了

解决方案 »

  1.   

    FileSystemWatcher 类
      

  2.   

    监控文件夹:FileSystemWatcher
    参考msdn
      

  3.   

    那位大侠能够给出针对这个具体问题的代码呢,很想对照着学习一下,FileSystemWatcher感觉还是有些功能实现不了呢
      

  4.   

    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.IO;namespace ConsoleApplication1
    {
        class Program
        {
            static int count = 0;
            static void Main(string[] args)
            {
                FileSystemWatcher watcher = new FileSystemWatcher("d:");
                watcher.Created += new FileSystemEventHandler(watcher_Created);
                watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName;
                watcher.Filter = "*.txt";            watcher.EnableRaisingEvents = true;            while (Console.Read() != 'q') ;
            }        static void watcher_Created(object sender, FileSystemEventArgs e)
            {
                FileInfo fi = new FileInfo(e.FullPath);
                if (fi.Length < 30 * 1024)
                    count++;
                else
                    count = 0;            if (count == 3)
                {
                    Console.WriteLine("playing music...");
                    count = 0;
                }
            }
        }
    }播放音乐的部分你自己去想法吧
      

  5.   

    多谢ivorstar!
    不过我想监控的是D:下某个文件夹下的文件,而不是D盘根目录下,这个暂时实现不了……,而且我想用winform来实现,请求代码,谢谢大家了。。
      

  6.   

    按照ivorstar提供的代码,还是有缺陷,只要生成3个文件就会显示playing music...,
    但我是想连续生成30k以上的话没必要报警的,是不是哪里出了问题?
      

  7.   


    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.IO;namespace ConsoleApplication1
    {
        class Program
        {
            static int count = 0;
            static void Main(string[] args)
            {
                Console.Write("请输入你想监视的目录:");
                string path = Console.ReadLine();
                FileSystemWatcher watcher = new FileSystemWatcher(path);
                watcher.Created += new FileSystemEventHandler(watcher_Created);
                watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName;
                watcher.Filter = "*.txt";            watcher.EnableRaisingEvents = true;            while (Console.Read() != 'q') ;
            }        static void watcher_Created(object sender, FileSystemEventArgs e)
            {
                FileInfo fi = new FileInfo(e.FullPath);
                if (fi.Length < 30 * 1024)
                    count++;
                else
                    count = 0;            if (count == 3)
                {
                    Console.WriteLine("playing music...");
                    Console.Beep();
                    count = 0;
                }
            }
        }
    }你说的连续30K是什么意思?
    是不是你想设定连续生成几个30k的文件才报警?
      

  8.   

    不是的,我的想法是 连续生成3个30kb以下的.txt文件才报警,生成30kb以上的就不要报警!但是按照ivorstar提供的代码,不管多少kb的文件生成,只要连续生成3个就报警……
      

  9.   

    9楼的方法你测试了吗?
    注意这一部分,如果连续生成3个30k一下的文件报警:        static void watcher_Created(object sender, FileSystemEventArgs e)
            {
                FileInfo fi = new FileInfo(e.FullPath);
                //如果生成的文件小于30k
                if (fi.Length < 30 * 1024)
                //生成的文件计数器加1
                    count++;
                //否则生成1个大于等于30k的文件
                else
                //文件计数器清零,防止生成任意三个文件即报警
                    count = 0;            //如果连续生成的小于30k的文件等于3个
                if (count == 3)
                {
                    //打印文字。这一行和下一行换成你想要的操作即可
                    Console.WriteLine("playing music...");
                    //让机箱小喇叭鸣叫一次
                    Console.Beep();
                    //文件计数器清零,以监视再次生成的小于30k的文件
                    count = 0;
                }
            }
      

  10.   

    我测试了九楼的代码,跟5楼差不多的,这部分我明白意思,但就是在调试的时候,我反复几次生成30kb以上的照样执行playing music…… 不明白为什么
      

  11.   

    是不是这两个if语句还是有问题啊,感觉每次不管生成多大的文件,count就会自动累计成3,然后执行后面的操作,大家可以调试看看难道是bug?
      

  12.   

    yalan,我也测试了好几遍,多粘贴几个大于30kb以上的.txt文件,前几个确实不会报警,但到后面,还是会报警,可我要的结果是如果持续生成30kb以上的是不可以报警的哦
      

  13.   

    又测试了好几遍,几百个50K的小文件,没发现你说的情况,而且按理论也不会出现你说的情况。不过这个情况倒是报警了:复制1个7K和1个50K的小文件粘贴到被监视路径,会报警。
      

  14.   

            static void watcher_Created(object sender, FileSystemEventArgs e)
            {
                FileInfo fi = new FileInfo(e.FullPath);
                if (fi.Length < 30 * 1024)
                    count++;
                else
                    count = 0;            Console.WriteLine("------count:" + count + ", file name:" + fi.Name + ", file length:" + fi.Length);
                
                if (count == 3)
                {
    测试过,没发现你说的误报,把调试信息加上,看看你那误报的时候显示的啥?
      

  15.   

    加上调试信息之后找到原因了,因为windows复制文件时是按步骤来的,有时候大于30kb的文件,刚开始复制的时候就触发了监控类,直接读取长度为0kb,所以计数器加1了……。程序本身没问题。所以还是得加一个watcherTimer类来延时监控。谢谢大家了!