【问题标题】:directory monitoring目录监控
【发布时间】:2010-05-08 08:37:24
【问题描述】:

对我来说检查添加到目录的新文件的最佳方法是什么,我认为文件系统观察器不合适,因为这不是始终可用的服务,而是在我的程序启动时运行的方法。

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

我可以存储上次检查文件夹的日期 - 使用 createddate > last check date 获取所有文件是否容易。

有人有什么想法吗?

谢谢

标记

【问题讨论】:

  • 这是一个有趣的问题。在没有内存驻留程序来注册这些事件的情况下,我没有一种方法可以跟踪目录的更改。 (顺便说一下,这些观察者也有其局限性)。您可能需要重新扫描目录树(在启动时、定期、随时),唯一的问题是如何尽可能快速有效地完成此操作。

标签: c# file directory


【解决方案1】:

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

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

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

【讨论】:

  • 为提示 tomtom 干杯,我的程序为每个文件调用数据库是对的,当然我可以重构一个区域。
【解决方案2】:

10 分钟对于 20,000 个文件来说似乎非常长。你打算怎么做比较?您的建议也不考虑已删除的文件。如果你想从数据库中删除这些,你必须做一个完整的比较。

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

【讨论】:

  • 你说得对,问题是往返,我不需要担心文件被删除,因为我每次尝试加载文件时都会检查这个问题
  • @foz1284:在这种情况下,可以选择使用时间戳。从技术上讲,它们并不是 100% 可靠的,因为有人可以更改文件上的时间戳。但是,在您的情况下,这可能不是问题。
【解决方案3】:

FileSystemWatchernot reliable,所以即使你可以使用服务,它也不一定适合你。

我能看到的两个选项是:

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

【讨论】:

  • 时间戳方法应该工作得很好,但只有如果您也不必检查已删除的文件。这不是问题的一部分,但你也有兴趣知道这一点是有道理的。可能,您可以不那么频繁地检查已删除的文件,或者在后台或其他地方。
【解决方案4】:

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

【讨论】:

    【解决方案5】:

    你能写一个在这台机器上运行的服务吗?然后该服务可以使用 FileSystemWtcher

    【讨论】:

    • 谢谢,我想过,但不喜欢有服务的想法,只是个人喜好
    • 这仍然不能保证您不会错过任何更改。此外 - 一般而言 - 为不时运行的应用程序运行服务是糟糕的设计。当然,在这种情况下它可能是可以接受的;这取决于应用程序的类型。
    【解决方案6】:

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

    如果您使用 Samba 在 linux 机器上挂载该目录,则可以使用 inotify 观察该目录。当然,这假设您不介意分散您的平台,但这就是 inotify 的用途。

    然后更正确,但您获得批准的机会也相应减少,如果您正在监视一个包含 20K 文件的目录,那么可能是时候改进您的系统架构了。不太了解您的应用程序,听起来消息队列可能值得一看。

    【讨论】:

    • 它是一个图片管理类型的应用程序,所以结构只是我的图片文件夹,正如 thorrarin 所说,为这个程序运行一个可能只是偶尔运行的服务似乎有点过头了
    猜你喜欢
    • 2010-09-11
    • 1970-01-01
    • 2012-05-08
    • 2010-10-05
    • 1970-01-01
    • 2010-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多