C# 关于文件监控遇到的问题

LXC-sunDay 2017-11-12 03:16:32
急求哪位大神解答:
需求说明,我现在要对一个文件目录进行实时监控,使用的是FileSystemWatcher,但是发现一个问题,当我监控的目录下,同时创建1000个文件(复制1000个文件到监控目录下)时,我的监控就会出现很多的文件遗漏,我查了一下,网上也没有明确的说法,是不是FileSystemWatcher这个监控是有上限的?如果是的话,那我的这个监控做法可能就行不通了,是不是有更好的实现方法。
补充说明,我的监控不一定一直有1000多个文件创建,这个监控目录是由其他的系统将文件传输过来的,可能10分钟一个文件,可能1秒钟N多的文件。
...全文
231 10 点赞 打赏 收藏 举报
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
LXC-sunDay 2017-11-13
我贴一下我的测试代码吧 private void button1_Click(object sender, EventArgs e) { if (button1.Text == "开启测试") { button1.Text = "测试中"; //侦听文件夹 _fileWatcher = new FileSystemWatcher(_filePath); _fileWatcher.Created += new FileSystemEventHandler(startListen); _fileWatcher.IncludeSubdirectories = true; _fileWatcher.EnableRaisingEvents = true; } else { button1.Text = "开启测试"; } } private void startListen(object sender, FileSystemEventArgs e) { //WriteLogTxt("我被触发了!"); while (true) { try { File.Move(e.FullPath, _bkupPath + "\\" + e.FullPath.Split('\\').Last()); break; } catch { System.Threading.Thread.Sleep(100); } } }
  • 打赏
  • 举报
回复
FileSystemWatcher.InternalBufferSize还有你事件方法里竟然还用while(true)
  • 打赏
  • 举报
回复
大然然 2017-11-13
以前做的系统和你需求一样,也遇见过FileSystemWatcher漏掉文件的问题,后来改为 线程 while ture 扫描文件夹,处理文件移走就好了。
  • 打赏
  • 举报
回复
LXC-sunDay 2017-11-13
引用 9 楼 chb345536638 的回复:
[quote=引用 6 楼 u013563449 的回复:] [quote=引用 5 楼 chb345536638 的回复:] FileSystemWatcher.InternalBufferSize还有你事件方法里竟然还用while(true)
测试代码就不要太纠结这个了,也就是说这个FileSystemWatcher.InternalBufferSize设置大一点就可行了对吗?[/quote] 你看那备注说明: 您可以将缓冲区设置为 4 KB 或更大,但不能超过 64 KB。 如果您尝试把 InternalBufferSize 属性设置为少于 4096 个字节,则将放弃您的值,并把 InternalBufferSize 属性设置为 4096 个字节。 为了获得最佳性能,请在基于 Intel 的计算机上使用 4 KB 的倍数。 系统通知组件文件发生更改,并将这些更改存储在组件创建并传递给 API 的缓冲区中。 每个事件最多可以使用 16 字节的内存,不包括文件名。 如果短时间内有很多更改,则缓冲区可能会溢出。 这将导致组件失去对目录更改的跟踪,并且它将只提供一般性通知。 增加缓冲区的大小可以防止丢失文件系统更改事件。 但是,增加缓冲区大小的开销较大,因为它来自无法换出到磁盘的非分页内存,所以将缓冲区保持得越小越好。 若要避免缓冲区溢出,请使用 NotifyFilter 和 IncludeSubdirectories 属性筛选掉不想要的更改通知。 [/quote]3Q,我刚刚试了一下,可以了。结贴,撒分。
  • 打赏
  • 举报
回复
引用 6 楼 u013563449 的回复:
[quote=引用 5 楼 chb345536638 的回复:] FileSystemWatcher.InternalBufferSize还有你事件方法里竟然还用while(true)
测试代码就不要太纠结这个了,也就是说这个FileSystemWatcher.InternalBufferSize设置大一点就可行了对吗?[/quote] 你看那备注说明: 您可以将缓冲区设置为 4 KB 或更大,但不能超过 64 KB。 如果您尝试把 InternalBufferSize 属性设置为少于 4096 个字节,则将放弃您的值,并把 InternalBufferSize 属性设置为 4096 个字节。 为了获得最佳性能,请在基于 Intel 的计算机上使用 4 KB 的倍数。 系统通知组件文件发生更改,并将这些更改存储在组件创建并传递给 API 的缓冲区中。 每个事件最多可以使用 16 字节的内存,不包括文件名。 如果短时间内有很多更改,则缓冲区可能会溢出。 这将导致组件失去对目录更改的跟踪,并且它将只提供一般性通知。 增加缓冲区的大小可以防止丢失文件系统更改事件。 但是,增加缓冲区大小的开销较大,因为它来自无法换出到磁盘的非分页内存,所以将缓冲区保持得越小越好。 若要避免缓冲区溢出,请使用 NotifyFilter 和 IncludeSubdirectories 属性筛选掉不想要的更改通知。
  • 打赏
  • 举报
回复
LXC-sunDay 2017-11-13
引用 7 楼 wanghui0380 的回复:
我得说“你是怎么发现他少了的” ps:你发现他的过程,就是你解决他的过程。你说他少了,你研究过了?startListen没有触发1000次??请先证明他
我在上面注释掉了一句代码 //WriteLogTxt("我被触发了!"); 这句代码是写文件的,我一开始就是通过出力的文件判断的。 还有startListen中有做文件移动处理,我的文件没能移动,这个也能证明吧。
  • 打赏
  • 举报
回复
wanghui0380 2017-11-13
我得说“你是怎么发现他少了的” ps:你发现他的过程,就是你解决他的过程。你说他少了,你研究过了?startListen没有触发1000次??请先证明他
  • 打赏
  • 举报
回复
LXC-sunDay 2017-11-13
引用 5 楼 chb345536638 的回复:
FileSystemWatcher.InternalBufferSize还有你事件方法里竟然还用while(true)
测试代码就不要太纠结这个了,也就是说这个FileSystemWatcher.InternalBufferSize设置大一点就可行了对吗?
  • 打赏
  • 举报
回复
大叔爱大众 2017-11-12
贴出你的代码
  • 打赏
  • 举报
回复
圣殿骑士18 2017-11-12
应该还是你对FileSystemWatcher使用不当。你可以贴出源码给大家看看。
  • 打赏
  • 举报
回复
相关推荐
发帖
C#
加入

10.6w+

社区成员

.NET技术 C#
申请成为版主
帖子事件
创建了帖子
2017-11-12 03:16
社区公告

让您成为最强悍的C#开发者