代码之家  ›  专栏  ›  技术社区  ›  Matt

检测自上次扫描以来文件系统中的更改

  •  3
  • Matt  · 技术社区  · 17 年前

    为文件系统编制索引的程序似乎知道自上次索引以来哪些部分发生了更改,并且只重新扫描该部分。如何确定自上次索引以来文件系统/文件的更改位置。不在乎你用什么语言回答,但我在想c和windows。

    这种程序的一个例子是红杉视图,它生成硬盘的树状图。

    6 回复  |  直到 16 年前
        1
  •  6
  •   cfeduke    17 年前

    一种相当简单的方法是,将文件系统报告的文件大小、日期(作为整数值)和给定目录中的文件名,并计算 checksum 然后,您可以与该目录关联。您仍然需要使用文件系统数据对所有目录执行此计算,但不必深入(打开文件以检查差异),除非校验和报告了差异。

    为了在文件级别跟踪特定的更改,您需要根据各个文件属性存储校验和,当然,还需要根据自上次扫描以来是否存在文件和子目录来存储校验和。

    这并不一定保证没有发生更改,因为有文件系统实用程序可以更改所有类型的属性,尽管这是基本扫描的良好第一步。

    你可以找到 source code 对于 fswatch 有用的

        2
  •  4
  •   Adrian Clark    17 年前

    如果你是在一个。Net托管语言,请尝试 FileSystemWatcher

    来自MSDN:

    使用FileSystemWatcher监视 指定目录中的更改。你 可以监视文件和 指定目录的子目录 目录您可以创建一个组件 要在本地计算机上查看文件,请使用 网络驱动器或远程计算机。

    要查看所有文件中的更改,请设置 将筛选器属性设置为空字符串 (“”)或使用通配符(“”) . 好的 查看特定文件,设置过滤器 属性设置为文件名。对于 例如,观察 把我的文件归档。设置过滤器 属性设置为“MyDoc.txt”。你也可以 注意某种类型的变化 文件例如,观察 如果要更改文本文件,请设置过滤器 属性设置为“*.txt”。

        3
  •  4
  •   ashleigh ashleigh    17 年前

    你有两个问题要处理。

    第一个是如果你想观察动态变化(在你的程序运行时)。在这种情况下,您需要使用Windows API ReadDirectoryChangesW。关于如何使用它,网上有很多例子。(注意……有些示例不是很好。此API调用可以并且将为每个调用返回多个事件,您需要仔细阅读接口,了解其工作原理,并处理返回的所有内容。)。

    第二个问题是,如果你有一个文件夹或文件夹列表,你想检查它/它们的内容是否发生了变化——通过添加/删除或更改该文件夹中的文件。

    在这种情况下,最有效的方法是一次读取一个文件名的文件夹内容,并进行累积哈希。不过,除此之外,您还希望获取属性(使用GetFileAttributesEx之类的工具),并将其包含在哈希中。(确保排除文件夹“”还有“…”-否则,结果将具有误导性。)

    这样做的原因是,您希望通过文件的大小、日期等捕捉文件中的更改。不过,您可能不希望包括上次访问的时间。

    任何大的散列函数都可以。结果是每个文件夹都有一个大数字(散列)。

    然后,在进行另一次传递时,重新计算散列,并与存储的散列比较该文件夹的最后一个已知状态。如果散列不匹配,则需要仔细查看文件夹。

    实际上,这种方法(很快)会告诉你,这里有一些东西需要你更详细地了解,你如何做到这一点取决于你试图实现的目标。

    这样做的好处是,您不会查看文件夹中每个文件的内容,而是查看一些元数据,这些元数据为您提供了足够的指示。因此,处理速度要快几千倍。

        4
  •  3
  •   Ferruccio    17 年前
        5
  •  1
  •   Windows programmer    17 年前

    FindFirstChangeNotification

        6
  •  1
  •   dgellow    13 年前

    在Linux(以及我认为的任何其他类似Unix的操作系统)下,可以为文件/文件夹生成一个哈希值,以表示其在给定时间的状态。稍后,只需重新生成哈希并将其与旧值进行比较。事实证明,这对我正在进行的一些项目非常有效!

    详情如下: http://vpalos.com/169/recursive-filedirectory-change-detection/

    它基本上对任何更改都很敏感(即使只是更改文件的访问时间)。