我正在制作一个协议,客户端和服务器,它提供类似于FTP的文件传输功能(以及其他功能)。我的协议和FTP之间的一个区别是我想将远程服务器的目录结构的副本存储在本地缓存中。服务器只能在Windows上运行(用C ++编写),因此任何适用的Win32 API调用都会受到赞赏(如果有的话)。最初连接时,客户端请求直接子节点(文件和目录,就像“ls”或“dir”,没有选项),然后当用户导航到目录时,此步骤将与您可能期望的新父节点重复
当然,大多数情况下,如果客户端请求给定服务器的同一目录两次,则目录的内容将是相同的。因此,我想在客户端上缓存每个目录列表的结果。我想要一种简单的方法来实现它,但是由于文件/目录访问和修改时间以及名称更改,它需要考虑到期的缓存条目,这是棘手的部分。理想情况下,我喜欢能够通过客户端实现几乎即时的目录列表的东西,例如哈希不仅考虑文件内容,还考虑子目录的内容的文件名,数据,修改和访问日期等的变化。 / p>
这不是完全依赖于FileSystemWatcher(或类似)对象的东西,因为即使程序仅偶尔运行,它也需要维护此缓存。当然,这些可以帮助维护缓存,但这只是问题的一部分。
到目前为止,我最好的(?)想法是使用FindFirstFile()和FindNextFile(),以及在WIN32_FIND_DATA结构中找到的连接和散列值(可能包含文件内容),并使用它作为令牌到期(仅表示任何这些字段的变化)。然后我会为每个目录中有一个这些令牌。当请求目录时,服务器将对所有内容进行哈希并将其与客户端提供的缓存哈希值进行比较,如果不同,则返回正常数据,否则返回HTTP 304等效值。做这样的事情有没有那么复杂的方式? “目录上次修改日期”是否在所有情况下都考虑了其子目录的每个文件的修改日期?我确信内置的Windows索引服务有这样的东西,但理想情况下我不需要依赖它。因为这个服务是用于文件共享的,所以涉及哈希的东西会特别好,这样我就可以自动有效地找到共享给定文件的其他人,但是在哈希计算过程中关注磁盘并不是一个问题。
我想知道其他比编程更有经验的人会解决这个问题(rsync和subversion解决了类似的问题,但不完全相同)。
答案 0 :(得分:0)
你问很多大脑的文件系统实现(向A. A. Milne道歉)。
这实际上是一个很好的基础,你可以很好地查看有关分布式文件系统的现有文献。我会想到AFS作为一种经过深入研究的方法的例子。
我怀疑你能不能做一些有用而准确的事情而不做一些严肃的功课。换句话说,“忽视所有现有技术都是愚蠢的。”