winapi - 如何检测程序执行过程中目录中的更改?

标签 winapi caching indexing filesystems file-sharing

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

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

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

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

因为此服务用于文件共享,所以涉及散列的东西会特别好,这样我就可以自动有效地找到共享给定文件的其他人,但在散列计算过程中,这比冲洗磁盘更不重要。

我想知道其他比我更有编程经验的人会如何解决这个问题(rsync 和 subversion 已经解决了类似的问题但不完全相同)。

最佳答案

你问了很多 Very Little Brain 的文件系统实现(向 A. A. Milne 道歉)。

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

我怀疑您是否能够在不做一些认真的功课的情况下想出一些有用且准确的东西。换句话说,“忽视所有现有技术是愚蠢的。”

关于winapi - 如何检测程序执行过程中目录中的更改?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3315600/

相关文章:

python - 使用 Numpy datetime64 对象索引/切片 Pandas DataFrame

c++ - 如何在 C++ 中为对话框实现 Windows 样式?

c++ - WriteProcessMemory 到启用了 SeDebugPrivilege 的 SYSTEM 进程。 (三、远景)

javascript - 将数据添加到 Angular $http 缓存

Python Pandas - 使用特定顺序重新索引数据框

MySQL 慢 SELECT 查询

c++ - 在哪里可以找到有关使用 Microsoft Windows SLAPI 的更多信息?

c - Windows编程中关于 "ScrollWindow"API函数第四个参数的困惑

java - 如何检查(调试)JPA 查询是否从缓存或数据库获取结果

java - Spring 4如何定时刷新ConcurrentMapCache?