2010-05-08 92 views
5

什么是最好的方式来检查添加到目录中的新文件,我不认为文件系统监视器是合适的,因为这不是一个永远在线的服务,而是一个当我的程序启动时运行的方法。目录监控

我正在监视的文件夹结构中有超过20,000个文件,目前我正逐个检查每个文件以查看文件路径是否在我的数据库表中,但这大约需要十分钟,我想加快它

我可以存储上次检查文件夹的日期 - 是否容易得到具有createddate>上次检查日期的所有文件。

任何人有任何想法?

感谢

马克

+0

这是一个有趣的问题。我不知道如何跟踪目录的更改,而无需驻留内存的程序来注册这些事件。 (顺便说一句,这些观察者也有其局限性)。您可能必须重新扫描目录树(启动时,定期,每当),唯一的问题是如何尽可能快速高效地完成目录树。 – 2010-05-08 08:59:31

回答

5

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

找出需要这么长时间。 20.000次检查不应花费10分钟 - 最多1次。你的程序写得很慢。你如何测试它?

提示:不要问数据库,获取所有文件列表到内存中,数据库中所有文件的列表,检查内存。 20.000到数据库的SQL语句太慢了,这样你需要ONE来获取列表。

+0

提示tomtom欢呼,你说得对我的程序调用每个文件的数据库,当然我可以重构一个区域。 – foz1284 2010-05-08 09:09:03

0

你可以写那台机器上运行的服务?该服务可以使用FileSystemWtcher

+0

感谢,我想过这个问题,但不喜欢有一个服务,只是个人喜好 – foz1284 2010-05-08 09:11:43

+0

这仍然不能保证你不会错过任何改变观念。另外 - 一般来说 - 有一个服务运行只是为了一个应用程序,现在运行,然后是不好的设计。当然,在这种情况下,它可能是可以接受的。它取决于应用程序的类型。 – Thorarin 2010-05-08 09:13:44

1

FileSystemWatchernotreliable,所以即使您可以使用服务,它也不一定适合您。

两个选项,我可以看到的是:

  1. 让你知道文件的列表,并保持比较到此列表中。这将允许您查看是否添加,删除等文件。将此列表保存在内存中,而不是查询每个文件的数据库。
  2. 正如你所建议的那样,存储一个时间戳并与其进行比较。
+0

时间戳方法应该工作得很好,但是*只*如果您不必检查删除的文件。这不是问题的一部分,但有意义的是,你也有兴趣知道这一点。可能的话,您可以更频繁地检查删除的文件,或在后台或其他地方进行检查。 – Thorarin 2010-05-08 09:02:00

2

对于20,000个文件,10分钟似乎非常长。你如何进行比较?您的建议也不会考虑删除的文件。如果你想从数据库中删除那些,你将不得不做一个完整的比较。

也许问题是数据库往返旅行。您可以从数据库中以大块(或全部一次)检索已知文件列表,并按字母顺序排序。对本地文件列表进行排序,然后走两个列表,随时处理缺失或新条目。

+0

你说得对这个问题是往返,我不需要担心已删除的文件,我检查这个我尝试加载一个文件欢呼 – foz1284 2010-05-08 09:10:47

+0

@ foz1284每次:在这种情况下,使用时间戳是一个选项。它们在技术上不是100%可靠的,因为有人可以更改文件的时间戳。但是,这对你的情况可能不是问题。 – Mick 2010-05-08 09:17:40

0

有如Kevin Jones所说的FileSystemWatcher服务可能是最实用的答案,但还有其他一些选择。

如果您在Linux机器上安装Samba,可以使用inotify观察目录。这当然假设你不介意分割你的平台,但这就是通知的目的。

然后更正确,但你得到一个反超的相应较少的机会,如果你坐在监控的目录,在它的文件20K它可能是时间去发展你的系统架构。不了解所有关于应用程序的更多信息,这听起来像是一个消息队列可能值得关注。

+0

其图片管理型应用程序,以便结构仅仅是My Pictures文件夹,如thorrarin说,有这个程序,它可能只零星地运行服务运行似乎矫枉过正 – foz1284 2010-05-08 09:32:01

1

可以在某处onfile创建的最后一个时间戳写的,很简单,可以为你工作。