0

请帮助我思考一个问题。我有一个用 C++/Qt 编写的应用程序(让我们称之为X),它应该存储并定期更新有关用户系统上安装的所有应用程序的信息。.desktop在 Linux 上,根据建议解析所有文件需要太多时间FreeDesktop.org——在我的计算机上大约需要 2-3 秒。所以,我决定使用缓存来处理文件。

缓存应该如何工作:

(注意,app 文件是一个文件,其中包含有关安装在用户系统上的应用程序的信息。例如,在 Linux 上可能是.desktop文件,在 Windows 上可能是文件.lnk等)

  1. 开始时,当应用程序文件位于用户系统上时,我们有一个目录列表(例如,在 Linux 上,该列表包括/usr/share/application目录)。
  2. X开始,它会遍历该列表中的所有文件夹并创建所有文件的“快照”。快照应该是包含文件完整路径和last modified时间的记录列表。然后,X解析快照中的所有文件并将必要的信息保存在假设appsInformation列表中。
  3. 一段时间后,X在该文件夹中创建文件的新快照。然后,它将新快照与旧快照进行比较,并创建三个更改列表:added列表,包含新快照中存在但旧快照中不存在的所有应用程序文件;modified列表,包含所有更改时间的应用程序文件;last modifieddeleted列表,其中包含旧快照中存在但新快照中不存在的所有应用程序文件。之后,它会从列表中的新文件中解析信息added并将其推送回列表,根据appsInformation列表更改列表中已存在的记录,并删除列表中与列表中文件匹配的现有记录。appsInformationmodifiedappsInformationdeleted

所以,我需要有两个文件系统快照,其中一个以某种方式连接到appsInformation列表。

我的问题是:我应该使用什么方法和工具来最好地构建所有这些架构?因此,使用快照应该至少比解析所有文件快两倍。我想过一些想法,但它们真的很丑陋且难以发布。我应该使用几个QList对象,每个对象都包含一个文件信息和一个指向appsInformation记录的指针吗?还是有更好的主意?谢谢您的帮助。

4

1 回答 1

1

我一开始不会使用轮询。相反,我会使用一些基于回调的文件系统监控库。Windows 和 Linux 都已经有了这个,请参阅这些问题的答案:

您使用这些库安装的回调通常不仅会被告知哪个文件已更改,还会告知有关更改的一些详细信息;即添加、删除或更改文件。因此,根据“更改类型”,您可以在appsInformationList.

于 2013-07-03T12:26:57.917 回答