请教各位,如何用c#实现一个监控报警的功能 由于接触C#不太久,请教各位高手,如何实现文件夹内针对特定文件的监控并报警功能。比如,D:\11文件夹内有许多不断生成的.txt文本文件,如果连续生成3个文件大小小于30kb的.txt文件就启动一段音乐程序用来发出警报。。在此先谢谢大家提供帮助了 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 FileSystemWatcher 类 监控文件夹:FileSystemWatcher参考msdn 那位大侠能够给出针对这个具体问题的代码呢,很想对照着学习一下,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以上的话没必要报警的,是不是哪里出了问题? 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个就报警…… 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? yalan,我也测试了好几遍,多粘贴几个大于30kb以上的.txt文件,前几个确实不会报警,但到后面,还是会报警,可我要的结果是如果持续生成30kb以上的是不可以报警的哦 又测试了好几遍,几百个50K的小文件,没发现你说的情况,而且按理论也不会出现你说的情况。不过这个情况倒是报警了:复制1个7K和1个50K的小文件粘贴到被监视路径,会报警。 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类来延时监控。谢谢大家了! c# 窗体切换子页面 按键后判断候选框是否显示 关于初始化的问题(第一次初始化,再次打开之后不进行初始化) 帮帮手修改个函数 怎样加入多个版本?具体怎么做? 用过Twain扫描的的朋友帮忙看看,关于选择一个指定的设备源的问题. 数字拼图 如何获取contextmenu的长度 .net与数据库编程问题 终于搞完了烦琐的毕业设计!来,大家进来聊聊! 如何用Visual C#画坐标及函数曲线 通过服务定时向数据库同添加摄像头所显示的图片。
参考msdn
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;
}
}
}
}播放音乐的部分你自己去想法吧
不过我想监控的是D:下某个文件夹下的文件,而不是D盘根目录下,这个暂时实现不了……,而且我想用winform来实现,请求代码,谢谢大家了。。
但我是想连续生成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个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;
}
}
{
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)
{
测试过,没发现你说的误报,把调试信息加上,看看你那误报的时候显示的啥?