3

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

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

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

到目前为止,我最好的(?)想法是使用 FindFirstFile() 和 FindNextFile(),并对 WIN32_FIND_DATA 结构中找到的值进行排序(不知何故)、连接和散列值(可能包含文件内容),并将其用作到期令牌(只是表示任何这些字段的变化)。然后我将为每个目录拥有这些令牌之一。当请求目录时,服务器将对所有内容进行哈希处理并将其与客户端提供的缓存哈希进行比较,如果不同,则返回正常数据,否则返回 HTTP 304 等效值。有没有一种不太复杂的方法来做这样的事情?“目录最后修改日期”是否在所有情况下都考虑了其每个子目录文件的修改日期?一世'

因为这项服务是用于文件共享的,所以涉及哈希的东西会特别好,这样我就可以自动有效地找到共享给定文件的其他人,但这比在哈希计算期间冲洗磁盘的问题要少。

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

4

1 回答 1

0

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

这实际上是一个很好的基础,你最好看看现有的关于分布式文件系统的文献。AFS是一个很好研究的方法的例子。

我怀疑你是否能够在不做一些严肃的作业的情况下提出一些有用和准确的东西。换句话说,忽略所有现有技术将是愚蠢的。

于 2010-07-23T06:06:35.767 回答