目录监控

5
什么是我检查目录中添加的新文件的最佳方法?我认为FileSystemWatcher不适合,因为它不是一直运行的服务,而是在我的程序启动时运行的方法。
我正在监视的文件夹结构中有超过20,000个文件。目前,我正在逐个检查每个文件,以查看文件路径是否在我的数据库表中。但这需要大约十分钟,如果可能的话,我想加快速度。
我可以存储上次检查文件夹的日期 - 是否容易获取所有创建日期>上次检查日期的文件。
有人有任何想法吗?
谢谢
马克

这是一个有趣的问题。我不知道有什么方法可以在没有内存驻留程序注册这些事件的情况下跟踪目录的更改。(顺便说一句,这些观察者也有其局限性)。你可能需要重新扫描目录树(在启动时、定期地、每当需要时),唯一的问题是如何尽快高效地完成它。 - Assaf Lavie
6个回答

5

您的方法是唯一可行的(即文件系统监视器允许您查看更改,而不是在启动时检查)。

找出需要这么长时间的原因。20000次检查不应该需要10分钟 - 最多可能需要1分钟。您的程序运行速度较慢。您如何测试它?

提示:不要询问数据库,将所有文件列表存入内存中,将数据库中的所有文件列表存入内存中,然后在内存中进行检查。向数据库发送20000个SQL语句太慢了,使用这种方法只需一个语句即可获取列表。


感谢提示TomTom,你说得对,我的程序为每个文件调用数据库,这确实是我可以重构的一个领域。 - foz1284

2

20000个文件的比较需要10分钟,这似乎有点长。你是如何进行比较的?你的建议也没有考虑到删除的文件。如果你想将这些文件从数据库中删除,你将不得不进行全面的比较。

也许问题在于数据库往返次数太多。你可以一次性或分批从数据库中检索已知文件列表,并按字母顺序排序。同样地,也要对本地文件列表进行排序,并遍历两个列表,在处理缺失或新条目时进行操作。


你说得对,问题确实是往返传输,我不需要担心已删除的文件,因为每次尝试加载文件时都会检查这一点。谢谢! - foz1284
@foz1284:在这种情况下,使用时间戳是一个选项。它们在技术上并不是100%可靠的,因为有人可能会更改文件的时间戳。然而,在您的情况下可能不是问题。 - Mick

1

FileSystemWatcher并不是可靠的,所以即使您可以使用服务,它也不一定适用于您。

我能看到的两个选项是:

  1. 维护一个已知文件列表并不断与此列表进行比较。这将允许您查看是否添加、删除了文件等。将此列表保存在内存中,而不是为每个文件查询数据库。
  2. 按照您的建议,存储时间戳并进行比较。

时间戳方法应该非常有效,但是仅当您不必检查已删除的文件时才有效。这不是问题的一部分,但是您也有兴趣知道这一点是有意义的。可能,您可以较少频繁地检查已删除的文件,或在后台进行检查等。 - Thorarin

1
你可以在某个地方写下onfile最后创建的时间戳,这很简单,可以为你工作。

0

你能否编写一个在该机器上运行的服务?该服务可以使用FileSystemWatcher。


谢谢,我考虑过那个,但不喜欢有一个服务的想法,这只是个人偏好。 - foz1284
这仍然不能保证您不会错过任何更改。而且,一般来说,为一个偶尔运行的应用程序运行服务是不好的设计。当然,在这种情况下可能是可以接受的;这取决于应用程序的类型。 - Thorarin

0

像Kevin Jones建议的那样拥有一个FileSystemWatcher服务可能是最实用的答案,但还有其他选择。

如果你在Linux盒子上使用Samba挂载目录,那么你可以使用inotify来监视该目录。当然,这假设你不介意分散你的平台,但这就是inotify的存在之处。

更正确的方法是,但对于你获得批准的机会相应地较小,如果你正在监视一个包含20K个文件的目录,那么现在可能是时候改进你的系统架构了。不知道你的应用程序更多的情况,听起来像一个消息队列值得一看。


这是一个图片管理类应用程序,因此结构只是我的图片文件夹,正如thorrarin所说,为此程序运行服务似乎有些过度。 - foz1284

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接