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

如何在程序执行期间检测目录中的更改?

  •  3
  • Hut8  · 技术社区  · 14 年前

    我正在制作一个协议、客户机和服务器,它提供类似于ftp的文件传输功能(以及其他功能)。我的协议和ftp之间的一个区别是,我希望将远程服务器目录结构的副本存储在本地缓存中。服务器将只在Windows上运行(用C++编写),所以可以欣赏任何适用的Win32 API调用(如果有的话)。当最初连接时,客户机请求直接子级(文件和目录,就像没有选项的“ls”或“dir”),然后当用户导航到一个目录时,这个步骤会像您期望的那样用新的父级重复。

    当然,大多数情况下,如果客户机两次请求给定服务器的同一目录,则该目录的内容将相同。因此,我希望缓存客户机上每个目录列表的结果。我想要一个简单的实现方法,但是它需要考虑到由于文件/目录访问和修改时间和名称更改而导致的缓存条目过期,这是一个棘手的部分。理想情况下,我希望客户机能够启用几乎即时的目录列表,比如哈希,它不仅考虑到文件内容,还考虑到子目录“内容”的文件名、数据、修改和访问日期等的更改。

    这不是完全依赖于FileSystemWatcher(或类似的)对象的东西,因为即使程序只是偶尔运行,它也需要维护这个缓存。当然,这些可以帮助维护缓存,但这只是问题的一部分。

    我最好的(?)目前的想法是使用findfirstfile()和findnextfile(),以及排序(以某种方式),连接和散列在win32查找数据结构中找到的值(可能包含文件内容),并将其用作过期的标记(只是表示这些字段中的任何一个字段发生了更改)。然后我将为每个目录使用这些令牌中的一个。当请求目录时,服务器将散列所有内容,并将其与客户端提供的缓存散列进行比较,如果不同,则返回正常数据,否则返回HTTP 304等效值。有没有一种不那么精细的方法来做这样的事情?“目录上次修改日期”是否在所有情况下都考虑到其子目录“文件”的每个修改日期?我确信内置的Windows索引服务有类似的功能,但理想情况下我不需要依赖它。

    因为这个服务是用于文件共享的,所以涉及哈希的一些东西会特别好,这样我就可以自动高效地找到共享给定文件的其他人,但在哈希计算过程中,这比托管磁盘更不重要。

    我想知道其他比我更有经验的编程人员会做些什么来解决这个问题(rsync和subversion解决了类似的问题,但不完全相同)。

    1 回复  |  直到 14 年前
        1
  •  0
  •   msw    14 年前

    你问了很多关于大脑很小的文件系统实现(向A.A.Milne道歉)。

    实际上,这是一个很好的基础,您可以很好地了解分布式文件系统的现有文献。 AFS 作为一个研究得很好的方法的例子。

    我怀疑你不必做认真的家庭作业就能想出有用和准确的东西。换一种说法,“忽视所有现有技术是愚蠢的。