当前位置:编程学习 > C#/ASP.NET >>

请教各位,如何用c#实现一个监控报警的功能

由于接触C#不太久,请教各位高手,如何实现文件夹内针对特定文件的监控并报警功能。

比如,D:\11文件夹内有许多不断生成的.txt文本文件,如果连续生成3个文件大小小于30kb的.txt文件就启动一段音乐程序用来发出警报。。

在此先谢谢大家提供帮助了 --------------------编程问答-------------------- FileSystemWatcher 类 --------------------编程问答-------------------- 监控文件夹:FileSystemWatcher
参考msdn --------------------编程问答-------------------- 那位大侠能够给出针对这个具体问题的代码呢,很想对照着学习一下,FileSystemWatcher感觉还是有些功能实现不了呢 --------------------编程问答-------------------- FileSystemWatcher ,才知道这个功能,学习了 --------------------编程问答--------------------
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;
            }
        }
    }
}

播放音乐的部分你自己去想法吧 --------------------编程问答-------------------- 多谢ivorstar!
不过我想监控的是D:下某个文件夹下的文件,而不是D盘根目录下,这个暂时实现不了……,而且我想用winform来实现,请求代码,谢谢大家了。。
--------------------编程问答-------------------- 再次求助大家啊! --------------------编程问答-------------------- 按照ivorstar提供的代码,还是有缺陷,只要生成3个文件就会显示playing music...,
但我是想连续生成30k以上的话没必要报警的,是不是哪里出了问题? --------------------编程问答--------------------
引用 8 楼 yester_king 的回复:
按照ivorstar提供的代码,还是有缺陷,只要生成3个文件就会显示playing music...,
但我是想连续生成30k以上的话没必要报警的,是不是哪里出了问题?




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的文件才报警? --------------------编程问答-------------------- 音乐部份我来帮你,洗唰唰,洗唰唰,洗唰唰.... --------------------编程问答-------------------- 不是的,我的想法是 连续生成3个30kb以下的.txt文件才报警,生成30kb以上的就不要报警!但是按照ivorstar提供的代码,不管多少kb的文件生成,只要连续生成3个就报警…… --------------------编程问答--------------------
引用 11 楼 yester_king 的回复:
不是的,我的想法是 连续生成3个30kb以下的.txt文件才报警,生成30kb以上的就不要报警!但是按照ivorstar提供的代码,不管多少kb的文件生成,只要连续生成3个就报警……



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;
            }
        }

--------------------编程问答-------------------- 我测试了九楼的代码,跟5楼差不多的,这部分我明白意思,但就是在调试的时候,我反复几次生成30kb以上的照样执行playing music…… 不明白为什么 --------------------编程问答-------------------- 是不是这两个if语句还是有问题啊,感觉每次不管生成多大的文件,count就会自动累计成3,然后执行后面的操作,大家可以调试看看。。。难道是bug? --------------------编程问答--------------------
引用 14 楼 yester_king 的回复:
是不是这两个if语句还是有问题啊,感觉每次不管生成多大的文件,count就会自动累计成3,然后执行后面的操作,大家可以调试看看。。。难道是bug?


程序肯定没问题,中午又测试了两遍。 --------------------编程问答-------------------- yalan,我也测试了好几遍,多粘贴几个大于30kb以上的.txt文件,前几个确实不会报警,但到后面,还是会报警,可我要的结果是如果持续生成30kb以上的是不可以报警的哦 --------------------编程问答-------------------- --------------------编程问答-------------------- FileSystemWatcher 类 --------------------编程问答--------------------
引用 16 楼 yester_king 的回复:
yalan,我也测试了好几遍,多粘贴几个大于30kb以上的.txt文件,前几个确实不会报警,但到后面,还是会报警,可我要的结果是如果持续生成30kb以上的是不可以报警的哦



又测试了好几遍,几百个50K的小文件,没发现你说的情况,而且按理论也不会出现你说的情况。

不过这个情况倒是报警了:复制1个7K和1个50K的小文件粘贴到被监视路径,会报警。 --------------------编程问答-------------------- 对啊,会出现误报警的情况,不知什么地方有问题…… --------------------编程问答--------------------
引用 20 楼 yester_king 的回复:
对啊,会出现误报警的情况,不知什么地方有问题……

        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)
            {

测试过,没发现你说的误报,把调试信息加上,看看你那误报的时候显示的啥? --------------------编程问答-------------------- 加上调试信息之后找到原因了,因为windows复制文件时是按步骤来的,有时候大于30kb的文件,刚开始复制的时候就触发了监控类,直接读取长度为0kb,所以计数器加1了……。程序本身没问题。所以还是得加一个watcherTimer类来延时监控。谢谢大家了!
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,