Windows 索引服务如何工作?

Posted

技术标签:

【中文标题】Windows 索引服务如何工作?【英文标题】:How Windows Indexing Service works? 【发布时间】:2011-06-05 05:00:11 【问题描述】:

我的任务是实现具有类似行为的服务。 我的问题是:

索引服务如何记住哪些文件已被索引,哪些没有,哪些文件已更改并需要重新索引?

另外,我可以停止此服务,然后在几天后启动它,它会继续工作。 它是否有自己的包含文件信息的数据库?

谢谢

【问题讨论】:

【参考方案1】:

通常,索引服务使用WaitForSingleObject / WaitForMultipleObjects 在通过调用FindFirstChangeNotification 创建的句柄上保持在后台。如果您想支持可以关闭索引服务(或用于已经存在的目录),您绝对应该在每个文件上存储上次运行索引的时间戳。您可以将其与给定文件的LastWriteTime 进行比较。

编辑:您应该使用ReadDirectoryChangesW 和另一个异步索引文件的线程,以确保不会错过任何更改。您可以为每个要索引的文件生成新线程(昂贵)或使用作业队列和固定数量的工作线程(最好是 1 或 2 个)

【讨论】:

好的,谢谢。似乎在停止/启动服务重新扫描文件系统并读取其数据库以检查自上次活动以来发生了什么变化? 完全正确。只需遍历索引目录中的每个文件及其子目录,并根据索引器数据库中的时间戳检查它们的 LastWrittenTime。 顺便说一句,如果同时更改了大量文件,它是如何工作的?该服务是否有可能丢失部分通知?在这种情况下,它不知道索引不是实际的...... 您可以通过将文件名排队到异步处理的线程安全作业队列来处理更改通知。这样您就可以尽快开始等待下一次更改。

以上是关于Windows 索引服务如何工作?的主要内容,如果未能解决你的问题,请参考以下文章

如何从代码中获取 Windows 索引服务状态?

如何强制 Windows 索引“活动”[关闭]

WINDOWS 服务主进程已停止工作?

SharePoint 是不是使用 windows 的索引服务?

Windows 搜索相当于索引服务“vpath”和“特征”

如果 Windows 索引服务不索引 Web.Config,它可以重新启动应用程序池吗?