一种文件搜索方法、装置、计算机设备和存储介质与流程

文档序号:29256671发布日期:2022-03-16 11:17阅读:96来源:国知局
一种文件搜索方法、装置、计算机设备和存储介质与流程

1.本公开涉及计算机技术领域,具体而言,涉及一种文件搜索方法、装置、计算机设备和存储介质。


背景技术:

2.分布式编译的工作通常由一个主服务器以及多个作为工作节点的编译服务器完成,具体的,主服务器在获取到针对包括目标工程的编译请求之后,需要对编译请求进行解析,确定出其中包括的各个编译命令以及各个编译命令对应的文件依赖列表,之后将文件依赖列表和编译命令发送至不同的编译服务器,以实现对目标工程对应的各个文件的编译。
3.但现有技术中,确定编译请求中的编译命令对应的文件依赖列表的过程耗时较长,效率较低,从而造成了分布式编译的整体效率较低。


技术实现要素:

4.本公开实施例至少提供一种文件搜索方法、装置、计算机设备和存储介质。
5.第一方面,本公开实施例提供了一种文件搜索方法,包括:
6.获取针对目标工程中的待编译文件的至少一个编译命令,针对每个所述编译命令,从所述编译命令中携带的入口文件的文件位置处获取所述入口文件,并从所述入口文件中获取与入口文件具有依赖关系的各个依赖文件的预处理指令;
7.针对每个所述依赖文件,基于所述入口文件对应的检索目录和所述依赖文件对应的预处理指令,生成所述依赖文件对应的查询键信息;
8.确定所述目标工程对应的预先建立的索引表中,是否存在与所述查询键信息相匹配的目标路径信息,并在确定所述索引表中存在与所述查询键信息相匹配的目标路径信息的情况下,按照所述目标路径信息指示的文件路径获取所述依赖文件。
9.在一种可能的实施方式中,所述方法还包括:
10.在预先建立的索引表中不存在与所述查询键信息相匹配的目标路径信息的情况下,按照所述检索目录中的每个目录的目录顺序,依次在各个所述目录中查找所述依赖文件的目标文件路径,并在所述目标文件路径指示的文件存储位置处获取所述依赖文件;
11.将所述目标文件路径作为与所述查询键信息相对应的所述目标路径信息,并将该查询键信息和该目标路径信息存储至所述索引表。
12.在一种可能的实施方式中,在获取到所述依赖文件之后,还包括:
13.将获取的所述依赖文件作为新的入口文件,并返回从所述入口文件中获取与入口文件具有依赖关系的各个依赖文件的预处理指令的步骤,直至获取到所述编译命令中携带的入口文件对应的各个依赖文件;
14.基于所述编译命令中携带的入口文件及该入口文件对应的各个依赖文件,生成所述编译命令对应的编译依赖列表,并将所述编译依赖列表和所述编译命令发送至编译服务
器,以使所述编译服务器基于所述编译命令,对所述编译依赖列表中的各个文件进行编译得到编译产物。
15.在一种可能的实施方式中,所述基于所述入口文件对应的检索目录和所述依赖文件对应的预处理指令,生成所述依赖文件对应的查询键信息,包括:
16.利用哈希算法对所述预处理指令和所述检索目录进行压缩处理,将压缩后的所述预处理指令和所述检索目录,作为所述依赖文件对应的查询键信息。
17.在一种可能的实施方式中,所述基于所述入口文件对应的检索目录和所述依赖文件对应的预处理指令,生成所述依赖文件对应的查询键信息,包括:
18.在所述检索目录中包括多个目录的情况下,确定所述多个目录中内容可更改的目标目录;
19.获取所述目标目录中包括的各个文件的文件内容,基于所述目标目录中包括的各个文件的文件内容、所述预处理指令和所述检索目录中除所述目标目录以外的各个目录,生成所述依赖文件对应的查询键信息。
20.在一种可能的实施方式中,所述将所述编译依赖列表和所述编译命令发送至编译服务器,包括:
21.在得到针对目标工程中的待编译文件的至少一个编译命令中的每个编译命令分别对应的编译依赖列表之后,将各个编译命令及其对应的编译依赖列表分别发送至不同的编译服务器。
22.在一种可能的实施方式中,所述获取针对目标工程中的待编译文件的至少一个编译命令,包括:
23.响应于针对目标工程中的编译请求,确定所述目标工程对应的待编译文件以及待编译文件的数量;
24.基于每个所述待编译文件和所述待编译文件的数量,生成针对所述目标工程中的每个所述待编译文件的至少一个编译命令。
25.第二方面,本公开实施例还提供一种文件搜索装置,包括:
26.获取模块,用于获取针对目标工程中的待编译文件的至少一个编译命令,针对每个所述编译命令,从所述编译命令中携带的入口文件的文件位置处获取所述入口文件,并从所述入口文件中获取与入口文件具有依赖关系的各个依赖文件的预处理指令;
27.生成模块,用于针对每个所述依赖文件,基于所述入口文件对应的检索目录和所述依赖文件对应的预处理指令,生成所述依赖文件对应的查询键信息;
28.判断模块,用于确定所述目标工程对应的预先建立的索引表中,是否存在与所述查询键信息相匹配的目标路径信息,并在确定所述索引表中存在与所述查询键信息相匹配的目标路径信息的情况下,按照所述目标路径信息指示的文件路径获取所述依赖文件。
29.在一种可能的实施方式中,所述判断模块,还用于在预先建立的索引表中不存在与所述查询键信息相匹配的目标路径信息的情况下,按照所述检索目录中的每个目录的目录顺序,依次在各个所述目录中查找所述依赖文件的目标文件路径,并在所述目标文件路径指示的文件存储位置处获取所述依赖文件;
30.将所述目标文件路径作为与所述查询键信息相对应的所述目标路径信息,并将该查询键信息和该目标路径信息存储至所述索引表。
31.在一种可能的实施方式中,所述装置还包括:
32.解析模块,用于在获取到所述依赖文件之后,将获取的所述依赖文件作为新的入口文件,并返回从所述入口文件中获取与入口文件具有依赖关系的各个依赖文件的预处理指令的步骤,直至获取到所述编译命令中携带的入口文件对应的各个依赖文件;
33.基于所述编译命令中携带的入口文件及该入口文件对应的各个依赖文件,生成所述编译命令对应的编译依赖列表,并将所述编译依赖列表和所述编译命令发送至编译服务器,以使所述编译服务器基于所述编译命令,对所述编译依赖列表中的各个文件进行编译得到编译产物。
34.在一种可能的实施方式中,所述生成模块,用于利用哈希算法对所述预处理指令和所述检索目录进行压缩处理,将压缩后的所述预处理指令和所述检索目录,作为所述依赖文件对应的查询键信息。
35.在一种可能的实施方式中,所述生成模块,用于在所述检索目录中包括多个目录的情况下,确定所述多个目录中内容可更改的目标目录;
36.获取所述目标目录中包括的各个文件的文件内容,基于所述目标目录中包括的各个文件的文件内容、所述预处理指令和所述检索目录中除所述目标目录以外的各个目录,生成所述依赖文件对应的查询键信息。
37.在一种可能的实施方式中,所述解析模块,用于在得到针对目标工程中的待编译文件的至少一个编译命令中的每个编译命令分别对应的编译依赖列表之后,将各个编译命令及其对应的编译依赖列表分别发送至不同的编译服务器。
38.在一种可能的实施方式中,所述获取模块,用于响应于针对目标工程中的编译请求,确定所述目标工程对应的待编译文件以及待编译文件的数量;
39.基于每个所述待编译文件和所述待编译文件的数量,生成针对所述目标工程中的每个所述待编译文件的至少一个编译命令。
40.第三方面,本公开可选实现方式还提供一种计算机设备,处理器、存储器,所述存储器存储有所述处理器可执行的机器可读指令,所述处理器用于执行所述存储器中存储的机器可读指令,所述机器可读指令被所述处理器执行时,所述机器可读指令被所述处理器执行时执行上述第一方面,或第一方面中任一种可能的实施方式中的步骤。
41.第四方面,本公开可选实现方式还提供一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被运行时执行上述第一方面,或第一方面中任一种可能的实施方式中的步骤。
42.关于上述文件搜索装置、计算机设备、及计算机可读存储介质的效果描述参见上述文件搜索方法的说明,这里不再赘述。
43.本公开实施例提供的文件搜索方法、装置、计算机设备和存储介质,基于入口文件对应的检索目录和入口文件对应的依赖文件的预处理指令,生成依赖文件对应的查询键信息;并从预先建立索引表中,筛选与查询键信息相匹配的目标路径信息的方式,可以实现在确定出目标路径信息的情况下,直接从目标路径信息指示的文件路径获取依赖文件。与现有技术中在确定每一个文件对应的路径信息时,均需要根据检索目录依次进行文件位置的查找,浪费了大量的时间,降低了文件搜索的效率相比,由于在文件标识和检索目录相同的情况下,同一文件对应的目标路径信息必定是相同的,所以本公开实施例通过建立的存储
有能够表征文件标识和检索目录的键信息、以及与该键信息相匹配的路径信息的索引表,在确定出依赖文件对应的查询键信息之后,只需要进行键信息的匹配即可确定出查询键信息对应的目标路径信息,不需要根据检索目录依次进行文件位置的查找,从而节省了大量的查找时间,有效提高了文件搜索的效率。
44.为使本公开的上述目的、特征和优点能更明显易懂,下文特举较佳实施例,并配合所附附图,作详细说明如下。
附图说明
45.为了更清楚地说明本公开实施例的技术方案,下面将对实施例中所需要使用的附图作简单地介绍,此处的附图被并入说明书中并构成本说明书中的一部分,这些附图示出了符合本公开的实施例,并与说明书一起用于说明本公开的技术方案。应当理解,以下附图仅示出了本公开的某些实施例,因此不应被看作是对范围的限定,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他相关的附图。
46.图1示出了本公开实施例所提供的一种文件搜索方法的流程图;
47.图2示出了本公开实施例所提供的一种键值对的示意图;
48.图3示出了本公开实施例所提供的一种获取编译命令对应的各个文件的流程图;
49.图4示出了本公开实施例所提供的一种文件搜索装置的示意图;
50.图5示出了本公开实施例所提供的一种计算机设备结构示意图。
具体实施方式
51.为使本公开实施例的目的、技术方案和优点更加清楚,下面将结合本公开实施例中附图,对本公开实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本公开一部分实施例,而不是全部的实施例。通常在此处描述和示出的本公开实施例的组件可以以各种不同的配置来布置和设计。因此,以下对本公开的实施例的详细描述并非旨在限制要求保护的本公开的范围,而是仅仅表示本公开的选定实施例。基于本公开的实施例,本领域技术人员在没有做出创造性劳动的前提下所获得的所有其他实施例,都属于本公开保护的范围。
52.另外,本公开实施例中的说明书和权利要求书及上述附图中的术语“第一”、“第二”等是用于区别类似的对象,而不必用于描述特定的顺序或先后次序。应该理解这样使用的数据在适当情况下可以互换,以便这里描述的实施例能够以除了在这里图示或描述的内容以外的顺序实施。
53.在本文中提及的“多个或者若干个”是指两个或两个以上。“和/或”,描述关联对象的关联关系,表示可以存在三种关系,例如,a和/或b,可以表示:单独存在a,同时存在a和b,单独存在b这三种情况。字符“/”一般表示前后关联对象是一种“或”的关系。
54.经研究发现,现有的分布式编译工作,针对任一编译命令,在确定出该编译命令中包括的入口文件对应的每个依赖文件时,都需要按照编译命令对应的检索目录依次进行解析,从而确定出入口文件对应的每个依赖文件的路径信息;而由于检索目录中通常可以包括大量且复杂的路径信息,入口文件对应的依赖文件的数量通常也相对较多,因此,按照编译命令对应的检索目录依次进行解析,以确定各个依赖文件对应的路径信息的方式,需要
花费大量的搜索时间,极大的降低了文件搜索的效率。
55.基于上述研究,本公开提供了一种文件搜索方法、装置、计算机设备和存储介质,通过建立的存储有能够表征文件标识和检索目录的键信息、以及与该键信息相匹配的路径信息的索引表,在确定出依赖文件对应的查询键信息之后,只需要进行键信息的匹配即可确定出查询键信息对应的目标路径信息,不需要根据检索目录依次进行文件位置的查找,从而节省了大量的查找时间,有效提高了文件搜索的效率。
56.针对以上方案所存在的缺陷,均是发明人在经过实践并仔细研究后得出的结果,因此,上述问题的发现过程以及下文中本公开针对上述问题所提出的解决方案,都应该是发明人在本公开过程中对本公开做出的贡献。
57.应注意到:相似的标号和字母在下面的附图中表示类似项,因此,一旦某一项在一个附图中被定义,则在随后的附图中不需要对其进行进一步定义和解释。
58.需要说明的是,本公开实施例中所提到的特定名词包括:
59.c语言:是一门面向过程的、抽象化的通用程序设计语言,广泛应用于底层开发;
60.c++语言:是c语言的继承,它既可以进行c语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计;
61.objective-c语言,是扩充c的面向对象编程语言;
62.哈算算法:是把任意长度的输入通过散列算法变换成固定长度的输出,该输出就是散列值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的算法;
63.md5信息摘要算法:md5 message-digest algorithm,一种被广泛使用的密码散列函数,可以产生出一个128位(16字节)的散列值,用于确保信息传输完整一致;
64.sha256算法:是一种主流的哈希算法,对于任意长度的消息,sha256算法都会产生一个256位的哈希值,称作消息摘要。这个摘要相当于是个长度为32个字节的数组,通常有一个长度为64的十六进制字符串来表示,其中1个字节=8位,一个十六进制的字符的长度为4位。
65.为便于对本实施例进行理解,首先对本公开实施例所公开的一种文件搜索方法进行详细介绍,本公开实施例所提供的文件搜索方法的执行主体一般为具有一定计算能力的计算机设备,在一些可能的实现方式中,该文件搜索方法可以通过处理器调用存储器中存储的计算机可读指令的方式来实现。
66.下面以执行主体为计算机设备为例对本公开实施例提供的文件搜索方法加以说明。
67.如图1所示,为本公开实施例提供的一种文件搜索方法的流程图,可以包括以下步骤:
68.s101:获取针对目标工程中的待编译文件的至少一个编译命令,针对每个编译命令,从编译命令中携带的入口文件的文件位置处获取入口文件,并从入口文件中获取与入口文件具有依赖关系的各个依赖文件的预处理指令。
69.这里,目标工程具体可以为代码编译工程,例如,可以为编译某一应用对应的代码的工程,目标工程中可以包括至少一个待编译文件,每个待编译文件可以为对应于一定功能的代码文件,多个待编译文件可以对应于目标工程的一个功能模块,一个功能模块对应
能够的功能相对完善和丰富。每个待编译文件中还可以包括该待编译文件所依赖的其他的待编译文件,可以称为该待编译文件的依赖文件,每个其他的待编译文件还可以包括该文件所依赖的其他的待编译文件,关于每个待编译文件对应的依赖文件的数量,可以根据实际的开发需要确定,在此不进行限定。具体实施时,目标工程可以为基于c++语言、c语言或objective-c语言这三种编程语言得到的工程,目标工程中的每个待编译文件为基于上述任一种编程语言得到的文件。
70.编译命令为对待编译文件进行编译的命令,其中可以包括需要编译的入口文件的文件标识、文件位置,以及与该入口文件具有依赖关系的依赖文件的检索目录等信息。一个待编译文件可以对应于至少一个编译命令,如一个待编译文件可以对应于一个对该待编译文件进行整体编译的编译命令。或者,也可以多个待编译文件对应于一个编译命令,例如,在多个待编译文件按照一定的工程结果和顺序进行编译之后,可以发挥更强大和更全面的功能的情况下,编译命令可以为针对上述多个待编译文件的命令。例如,编译命令可以为“clang-c hello.m-i foo-i bar-i baz”,其中,“hello.m”表示入口文件的文件标识,
“‑
i foo-i bar-i baz”表示入口文件对应的三个检索目录,该编译命令表示对文件标识为“hello.m”的文件进行编译,该文件对应的依赖文件可以在检索目录
“‑
i foo-i bar-i baz”中获取,上述文件标识和检索目录均可以称为编译参数。
71.入口文件可以为每个编译命令对应的需要编译的目标文件,入口文件中可以包括其所依赖的多个依赖文件,入口文件所依赖的多个依赖文件需要对入口文件进行解析之后,根据解析得到的预处理指令确定。预处理指令即为对该命令对应的依赖文件进行处理的指令,其中包括依赖文件的文件标识。例如,预处理指令可以为“#include“xxx.h
””
,表示为对文件标识为“xxx.h”的依赖文件进行预处理的指令。检索目录中可以包括多个子目录,每个子目录下可以对应于多个新的子目录,也可以对应于多个文件,检索目录可以为用户预先设定好的,入口文件对应的各个依赖文件可能出现的目录。在具体实施时,检索目录可以用特定字符进行标识,可以用-i+参数的方式标识、-f+参数的方式标识等。如上例编译命令所示,-i foo-i bar-i baz表示三个检索目录依次为foo目录、bar目录和baz目录。文件标识具体可以为文件名称,如上例编译命令所示,文件标识“hello.m”即可以表示文件名称为hello.m的文件。
72.具体实施时,在获取到目标工程对应的各个待编译文件之后,可以响应于用户在编译软件上的针对目标工程的编译操作,根据目标工程对应的工程结构和配置,生成针对目标工程对应的至少部分待编译文件中的每个待编译文件的至少一个编译命令。
73.或者,也可以直接获取针对目标工程中的待编译文件的至少一个编译命令,编译命令可以为利用编译软件、编译器、服务器等提前根据目标工程中的待编译文件的生成的。
74.在获取到针对目标工程中的待编译文件的至少一个编译命令之后,可以利用预先部署的一个假编译器对编译命令进行处理,具体的,针对至少一个编译命令中的每个编译命令,可以利用预先部署的假编译器对该编译命令进行命令解析处理,确定出该编译命令中携带的入口文件的文件位置,以及编译命令中携带的入口文件对应的检索目录。如上例编译命令所示,利用假编译器对该编译命令进行处理可以表示为:“fake_clang-c hello.m-i foo-i bar-i baz”,其中,fake clang表示假编译器。
75.进一步的,可以在入口文件的文件位置处获取入口文件,并从入口文件中获取与
入口文件具有依赖关系的各个依赖文件的预处理指令。
76.例如,可以对获取的入口文件进行文件内容的分析,获取入口文件中包括的预处理指令,也即从入口文件中获取“#include+“文件标识
””
语句,该语句中的文件标识对应的文件即为与入口文件具有依赖关系的依赖文件,该语句即为针对该依赖文件的预处理指令。
77.其中,入口文件中包括的预处理指令可以包括一个或多个,每个预处理指令可以对应于不同的依赖文件。基于对入口文件的分析,可以确定出与入口文件具有依赖关系的每个依赖文件。
78.s102:针对每个依赖文件,基于入口文件对应的检索目录和依赖文件对应的预处理指令,生成依赖文件对应的查询键信息,查询键信息用于表征文件标识和检索目录。
79.其中,查询键信息用于表征预处理指令和检索目录,入口文件对应的检索目录即为编译命令对应的检索目录。
80.具体实施时,针对确定出的每个依赖文件,可以按照预设的合并规则,将该依赖文件的预处理指令和入口文件对应的检索目录进行合并,得到依赖文件对应的查询键信息。以合并规则可以为预处理指令之前、检索目录在后,预处理指令为“#include“111.h
””
,检索目录为
“‑
i a-i b-i c”为例,则得到的查询键信息可以为“#include“111.h-i a-i b-i c
””
。在实际应用时,编译命令中包括的信息相对复杂,表示检索目录的参数也十分复杂,在此仅做一个简单的实例,例如,在实际应用时,检索目录可以对应于若干代码行,并可以包括若干子目录。
81.或者,也可以将依赖文件的预处理指令中的文件标识和编译命令对应的检索目录进行合并,得到依赖文件对应的查询键信息。
82.在一种实施例中,在得到预处理指令和检索目录之后,可以利用哈希算法对预处理指令和检索目录进行压缩处理,将压缩后的预处理指令和检索目录,作为依赖文件对应的查询键信息。这样,查询键信息既可以表征检索目录,又可以表征依赖文件对应的预处理命令。
83.或者,也可以利用其他的加密压缩算法,如md5信息摘要算法、sha-256算法等,对预处理指令和检索目录进行压缩和加密处理,将加密压缩后的预处理指令和检索目录,作为依赖文件对应的查询键信息。
84.s103:确定目标工程对应的预先建立的索引表中,是否存在与查询键信息相匹配的目标路径信息,并在确定索引表中存在与查询键信息相匹配的目标路径信息的情况下,按照目标路径信息指示的文件路径获取依赖文件。
85.上述预先建立的索引表中可以包括多个已经预先确定的键信息以及与该键相匹配的路径信息。键信息可以表征一个预处理指令和该预处理指令对应的检索目录,路径信息即为与预处理指令中包括的文件标识相匹配的文件的存储路径。具体实施时,索引表可以为基于在先解析的编译命令的编译结果不断确定或完成的。
86.具体实施时,在得到依赖文件对应的查询键信息之后,可以从预先建立的索引表中查询,是否存在与查询键信息相匹配的目标路径信息,具体的,可以从索引表中查询是否存在与查询键信息一致的键信息,如果是,则可以将该键信息对应的路径信息作为与查询键信息相匹配的目标路径信息。这里,由于在文件标识和检索目录相同的情况下,同一文件
对应的目标路径信息必定是相同的,而在利用同一算法对检索目录和包括文件标识的预处理命令进行压缩后得到的键信息必定相同;因此,若索引表中存在与查询键信息一致的键信息,则可以说明两个键信息对应的检索目录和预处理命令相同,两个键信息对应的路径信息也相同;将与查询键信息一致的键信息对应的路径信息作为与查询键信息相匹配的目标路径信息,即可以在该目标路径信息指示的文件路径处获取查询键信息对应的依赖文件。
87.进一步的,在确定索引表中存在与查询键信息相匹配的目标路径信息的情况下,可以按照目标路径信息指示的文件路径获取依赖文件。
88.这样,通过建立的存储有能够表征文件标识和检索目录的键信息、以及与该键信息相匹配的路径信息的索引表,在确定出依赖文件对应的查询键信息之后,只需要进行键信息的匹配即可确定出查询键信息对应的目标路径信息,不需要根据检索目录依次进行文件位置的查找,从而节省了大量的查找时间,有效提高了文件搜索的效率。
89.在一种实施例中,针对s103,在确定预先建立的索引表中不存在与上述查询键信息相匹配的目标路径信息的情况下,还可以按照编译命令对应的检索目录进行文件存储位置的检索。具体的,可以先确定编译命令对应的检索目录中包括的目录(即上述子目录)的数量,以及每个目录对应的目录顺序。例如,在编译命令对应的检索目录为
“‑
i foo-i bar-i baz”的情况下,则foo、bar和baz三个子目录对应的目录顺序即为先在foo目录下检索,在foo目录下检索不到时,在bar目录下检索;在bar目录下检索不到时,在baz目录下检索。
90.之后,按照确定的检索目录中的每个目录的目录顺序,依次在各个目录中查找依赖文件,直至确定出依赖文件对应的目标文件路径,其中,目标文件路径指示着依赖文件的文件存储位置。在确定出目标文件路径的情况下,可以直接在目标文件路径指示的文件存储位置处获取依赖文件。在查找依赖文件的目标文件路径时,可以先在入口文件的文件位置对应的目录中查找,在该目录中查找不到时,再按照检索目录中的每个目录的目录顺序,依次在各个目录中查找依赖文件的目标文件路径。
91.在一种实施方式中,入口文件对应的依赖文件的检索目录也可以为用户预先指定的、与入口文件对应的检索目录不同的目录,这种情况下,在得到针对依赖文件的预处理指令之后,还需要获取用户预先指定的检索目录,基于该检索目录和该预处理指令生成该依赖文件对应的查询键信息。
92.另外,目标文件路径指示的文件存储位置处还可以存储有多个不同的文件,在这种情况下,可以在文件存储位置处存储的多个文件中,查找出文件标识与依赖文件的文件标识相同的文件,该文件即为依赖文件。
93.在确定出依赖文件对应的目标文件路径之后,可以将该目标文件路径作为与查询键信息相对应的目标路径信息,并将该目标路径信息和该查询键信息作为一个新的键值对存储至索引表中,其中,键为查询键信息,值为目标路径信息。如图2所示,为本公开实施例所提供的一种键值对的示意图。这样,在后续生成的新的查询键信息与该键值对中的查询键信息相匹配的情况下,可以直接利用该键值对中的值进行上述新的查询键信息对应的文件的获取。
94.在一种实施例中,在入口文件存在依赖文件的情况下,在获取到依赖文件之后,还可以按照以下步骤获取入口文件对应的每个依赖文件:
95.步骤一、将获取的依赖文件作为新的入口文件,并返回从入口文件中获取与入口文件具有依赖关系的各个依赖文件的预处理指令的步骤,直至获取到编译命令中携带的入口文件对应的各个依赖文件。
96.本步骤中,在得到依赖文件之后,可以将得到的依赖文件作为新的入口文件,然后,返回执行上述s101中,从入口文件中获取与入口文件具有依赖关系的各个依赖文件的预处理指令的步骤,确定是否存在与该入口文件存在依赖关系的新的依赖文件,如果有,则可以执行上述s102,基于该新的依赖文件对应的预处理指令和入口文件对应的检索目录,生成该新的依赖文件对应的查询键信息,并返回执行上述s103,确定索引表中是否存在与查询键信息相匹配的目标路径信息的步骤,直至得到该新的依赖文件。
97.进而,可以将该新的依赖文件作为新的入口文件,再返回执行上述s101、s102和s103,经过若干次循环,可以得到编译命令中携带的入口文件对应的各个依赖文件,以及入口文件及其对应的各个依赖文件之间的依赖关系。
98.如果确定不存在与该依赖文件存在依赖关系的新的依赖文件,则可以确定已经得到入口文件对应的各个依赖文件。
99.步骤二、基于编译命令中携带的入口文件及该入口文件对应的各个依赖文件,生成编译命令对应的编译依赖列表,并将编译依赖列表和编译命令发送至编译服务器,以使编译服务器基于编译命令,对编译依赖列表中的各个文件进行编译得到编译产物。
100.这里,编译依赖列表中包括入口文件及其对应的文件位置、入口文件对应的依赖文件,以及每个依赖文件的目标路径信息。
101.具体实施时,可以按照入口文件及其对应的文件位置、入口文件对应的依赖文件,以及每个依赖文件的目标路径信息,生成编译命令对应的包括各个文件的编译依赖列表。
102.之后,可以将该编译依赖列表和编译命令发送至编译服务器,利用编译服务器基于编译命令,按照编译依赖列表对应的依赖关系,对编译依赖列表中的各个文件进行编译得到编译产物。其中,编译服务器即为工作节点,不同的编译服务器为不同的工作节点,确定依赖文件列表的步骤为主服务器完成的。
103.在一种实施例中,针对将编译依赖列表和编译命令发送至编译服务器的步骤,在得到针对目标工程中的待编译文件的至少一个编译命令中的每个编译命令分别对应的编译依赖列表之后,可以将各个编译命令及该编译命令对应的编译依赖列表分别发送至不同的编译服务器。这里,确定出每个编译命令对应的编译依赖列表的步骤可以为主服务器同步完成的。利用不同的编译服务器对编译依赖列表对应的各个文件进行编译,可以保证分布式编译的效率。
104.在各个编译服务器得到编译产物之后,可以将编译产物反馈给主服务器,这样,主服务器可以对反馈的各个编译产物进行处理,例如,按照目标工程的工程结构进行合并,从而得到目标工程对应的最终编译产物。
105.在一种实施例中,针对s102中基于入口文件对应的检索目录和依赖文件对应的预处理指令,生成依赖文件对应的查询键信息,还可以按照以下步骤实施:
106.s102-1:在检索目录中包括多个目录的情况下,确定多个目录中内容可更改的目标目录。
107.这里,目标目录即为检索目录包括多个目录中内容可更改的目录。
108.在检索目录中包括多个目录的情况下,其中可能存在部分内容可更改的目标目录。目标目录中可更改的内容可以该目录下的各个文件的文件内容,该目录中包括的子目录、包括的子目录的数量等等。
109.具体实施时,在检索目录中包括多个目录的情况下,可以先确定出多个目录中内容可更改的目标目录。
110.s102-2:获取目标目录中包括的各个文件的文件内容,基于目标目录中包括的各个文件的文件内容、预处理指令和检索目录中除目标目录以外的各个目录,生成依赖文件对应的查询键信息。
111.本步骤中,针对确定出的每个目标目录,可以获取该目标目录中包括的各个文件的文件内容。进而,可以利用哈希算法,对每个目标目录中包括的各个文件的文件内容、依赖文件对应的预处理指令以及检索目录中除目标目录以外的各个目录进行压缩处理,得到依赖文件对应的查询键信息。
112.另外,在查找依赖文件的依赖文件的路径信息时,如果该依赖文件对应的检索目录中也包括内容可更改的目标目录,也可以按照上述s102-1和s102-2,确定出该依赖文件对应的查询键信息,此处不再赘述。
113.在一种实施方式中,在编译命令对应的检索目录中可能包括“hmap”文件,其中,“hmap”文件中存储的信息为文件标识与路径信息之间的映射关系,并且在一些情况下,其中存储的文件标识与路径信息之间的映射关系并不完整。例如,一个工程对应的文件包括“a.h”、“b.h”和“c.h”三个文件,但“hmap”文件中存储的映射关系可能仅包括“a.h”和“b.h”两个文件对应的映射关系,并未存储有“c.h”文件对应的映射关系。并且,“hmap”文件中存储的信息还存在动态更新的可能。
114.基于“hmap”文件的上述特性,即使针对同一文件,在前一次搜索该文件时,可能可以基于“hmap”文件找到,但在下一次搜索该文件时,由于“hmap”文件中内容的更新,可能出现无法基于“hmap”文件找到该文件的情况。
115.因此,在某个依赖文件对应的目标路径信息与“hmap”文件相关时,生成该依赖文件对应的查询键信息的步骤可以为:获取“hmap”文件的文件内容,然后基于该“hmap”文件的文件内容、编译命令对应的检索目录和该依赖文件对应的预处理指令,生成该依赖文件对应的查询键信息。
116.这样,基于“hmap”文件的文件内容生成查询键信息并存在索引表中,可以保证在后续利用索引表查询某一依赖文件的目标路径信息时,如果匹配到该查询键信息,则可以说明依赖文件对应的查询键信息所表征的检索目录中的“hmap”文件的文件内容与预先存储在索引表中键信息所表征的检索目录中的“hmap”文件的文件内容相同,进而一定可以基于“hmap”文件确定出目标路径信息。
117.在一种实施例中,针对s101中获取针对目标工程中的待编译文件的至少一个编译命令的步骤,可以按照如下步骤实施:
118.s101-1:响应于针对目标工程中的编译请求,确定目标工程对应的待编译文件以及待编译文件的数量。
119.这里,编译请求可以为用户发起的编译目标工程的请求。
120.具体实施时,可以响应于用户发起的针对目标工程中的编译请求,确定出目标工
程对应的待编译文件的数量,以及确定出每个待编译文件。
121.s101-2:基于每个待编译文件和待编译文件的数量,生成针对目标工程中的每个待编译文件的至少一个编译命令。
122.这里,可以将待编译文件的数量作为需要生成的编译命令的数量,也即一个待编译文件可以对应于一个编译命令。然后,可以基于每个待编译文件,分别生成与每个待编译文件相对应的编译命令。其中,每个编译命令中可以仅包括待编译文件的文件标识,即入口文件的文件标识,还可以包括入口文件的文件位置,不包括待编译文件的文件内容。
123.或者,可以根据目标工程的工程结构和配置,确定出需要生成的编译命令的数量,以及每个编译命令对应一个或多个待编译文件,且一个待编译文件也可以对应于多个编译命令。之后,可以基于目标工程对应的待编译文件,分别生成针对目标工程中的每个待编译文件的至少一个编译命令。
124.如图3所示,为本公开实施例所提供的一种获取编译命令对应的各个文件的流程图,可以包括以下步骤:
125.s301:获取针对目标工程中的待编译文件的至少一个编译命令,针对每个编译命令,从编译命令中携带的入口文件的文件位置处获取入口文件,并从入口文件中获取与入口文件具有依赖关系的各个依赖文件的预处理指令。
126.s302:针对每个依赖文件,基于入口文件对应的检索目录和依赖文件对应的预处理指令,生成依赖文件对应的查询键信息。
127.s303:确定目标工程对应的预先建立的索引表中,是否存在与查询键信息相匹配的目标路径信息。
128.如果是,执行s304;如果否,执行s305。
129.s304:按照目标路径信息指示的文件路径获取依赖文件。
130.s305:按照检索目录中的每个目录的目录顺序,依次在各个目录中查找依赖文件的目标文件路径,并在目标文件路径指示的文件存储位置处获取依赖文件;将目标文件路径作为与查询键信息相对应的目标路径信息,并将该查询键信息和该目标路径信息存储至索引表。
131.这里,s304和s305两个步骤之间不存在执行顺序,为择一选择的执行步骤。
132.s306:将获取的依赖文件作为新的入口文件,并返回执行从入口文件中获取与入口文件具有依赖关系的各个依赖文件的预处理指令的步骤,直至获取到编译命令中携带的入口文件对应的各个依赖文件。
133.s307:基于编译命令中携带的入口文件及该入口文件对应的各个依赖文件,生成编译命令对应的编译依赖列表,并将编译依赖列表和编译命令发送至编译服务器。
134.关于上述s301~s307的具体实施步骤,可以参照上述各实施例,此处不再赘述。
135.本领域技术人员可以理解,在具体实施方式的上述方法中,各步骤的撰写顺序并不意味着严格的执行顺序而对实施过程构成任何限定,各步骤的具体执行顺序应当以其功能和可能的内在逻辑确定。
136.基于同一发明构思,本公开实施例中还提供了与文件搜索方法对应的文件搜索装置,由于本公开实施例中的装置解决问题的原理与本公开实施例上述文件搜索方法相似,因此装置的实施可以参见方法的实施,重复之处不再赘述。
137.如图4所示,为本公开实施例提供的一种文件搜索装置的示意图,包括:
138.获取模块401,用于获取针对目标工程中的待编译文件的至少一个编译命令,针对每个所述编译命令,从所述编译命令中携带的入口文件的文件位置处获取所述入口文件,并从所述入口文件中获取与入口文件具有依赖关系的各个依赖文件的预处理指令;
139.生成模块402,用于针对每个所述依赖文件,基于所述入口文件对应的检索目录和所述依赖文件对应的预处理指令,生成所述依赖文件对应的查询键信息;
140.判断模块403,用于确定所述目标工程对应的预先建立的索引表中,是否存在与所述查询键信息相匹配的目标路径信息,并在确定所述索引表中存在与所述查询键信息相匹配的目标路径信息的情况下,按照所述目标路径信息指示的文件路径获取所述依赖文件。
141.在一种可能的实施方式中,所述判断模块403,还用于在预先建立的索引表中不存在与所述查询键信息相匹配的目标路径信息的情况下,按照所述检索目录中的每个目录的目录顺序,依次在各个所述目录中查找所述依赖文件的目标文件路径,并在所述目标文件路径指示的文件存储位置处获取所述依赖文件;
142.将所述目标文件路径作为与所述查询键信息相对应的所述目标路径信息,并将该查询键信息和该目标路径信息存储至所述索引表。
143.在一种可能的实施方式中,所述装置还包括:
144.解析模块404,用于在获取到所述依赖文件之后,将获取的所述依赖文件作为新的入口文件,并返回从所述入口文件中获取与入口文件具有依赖关系的各个依赖文件的预处理指令的步骤,直至获取到所述编译命令中携带的入口文件对应的各个依赖文件;
145.基于所述编译命令中携带的入口文件及该入口文件对应的各个依赖文件,生成所述编译命令对应的编译依赖列表,并将所述编译依赖列表和所述编译命令发送至编译服务器,以使所述编译服务器基于所述编译命令,对所述编译依赖列表中的各个文件进行编译得到编译产物。
146.在一种可能的实施方式中,所述生成模块402,用于利用哈希算法对所述预处理指令和所述检索目录进行压缩处理,将压缩后的所述预处理指令和所述检索目录,作为所述依赖文件对应的查询键信息。
147.在一种可能的实施方式中,所述生成模块402,用于在所述检索目录中包括多个目录的情况下,确定所述多个目录中内容可更改的目标目录;
148.获取所述目标目录中包括的各个文件的文件内容,基于所述目标目录中包括的各个文件的文件内容、所述预处理指令和所述检索目录中除所述目标目录以外的各个目录,生成所述依赖文件对应的查询键信息。
149.在一种可能的实施方式中,所述解析模块404,用于在得到针对目标工程中的待编译文件的至少一个编译命令中的每个编译命令分别对应的编译依赖列表之后,将各个编译命令及其对应的编译依赖列表分别发送至不同的编译服务器。
150.在一种可能的实施方式中,所述获取模块401,用于响应于针对目标工程中的编译请求,确定所述目标工程对应的待编译文件以及待编译文件的数量;
151.基于每个所述待编译文件和所述待编译文件的数量,生成针对所述目标工程中的每个所述待编译文件的至少一个编译命令。
152.关于装置中的各模块的处理流程、以及各模块之间的交互流程的描述可以参照上
述方法实施例中的相关说明,这里不再详述。
153.本公开实施例还提供了一种计算机设备,如图5所示,为本公开实施例提供的一种计算机设备结构示意图,包括:
154.处理器51和存储器52;所述存储器52存储有处理器51可执行的机器可读指令,处理器51用于执行存储器52中存储的机器可读指令,所述机器可读指令被处理器51执行时,处理器51执行下述步骤:s101:获取针对目标工程中的待编译文件的至少一个编译命令,针对每个编译命令,从编译命令中携带的入口文件的文件位置处获取入口文件,并从入口文件中获取与入口文件具有依赖关系的各个依赖文件的预处理指令;s102:针对每个依赖文件,基于入口文件对应的检索目录和依赖文件对应的预处理指令,生成依赖文件对应的查询键信息以及s103:确定目标工程对应的预先建立的索引表中,是否存在与查询键信息相匹配的目标路径信息,并在确定索引表中存在与查询键信息相匹配的目标路径信息的情况下,按照目标路径信息指示的文件路径获取依赖文件。
155.上述存储器52包括内存521和外部存储器522;这里的内存521也称内存储器,用于暂时存放处理器51中的运算数据,以及与硬盘等外部存储器522交换的数据,处理器51通过内存521与外部存储器522进行数据交换。
156.上述指令的具体执行过程可以参考本公开实施例中所述的文件搜索方法的步骤,此处不再赘述。
157.本公开实施例还提供一种计算机可读存储介质,该计算机可读存储介质上存储有计算机程序,该计算机程序被处理器运行时执行上述方法实施例中所述的文件搜索方法的步骤。其中,该存储介质可以是易失性或非易失的计算机可读取存储介质。
158.本公开实施例所提供的文件搜索方法的计算机程序产品,包括存储了程序代码的计算机可读存储介质,所述程序代码包括的指令可用于执行上述方法实施例中所述的文件搜索方法的步骤,具体可参见上述方法实施例,在此不再赘述。
159.该计算机程序产品可以具体通过硬件、软件或其结合的方式实现。在一个可选实施例中,所述计算机程序产品具体体现为计算机存储介质,在另一个可选实施例中,计算机程序产品具体体现为软件产品,例如软件开发包(software development kit,sdk)等等。
160.所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的装置的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。在本公开所提供的几个实施例中,应该理解到,所揭露的装置和方法,可以通过其它的方式实现。以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,又例如,多个单元或组件可以结合,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些通信接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
161.所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
162.另外,在本公开各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。
163.所述功能如果以软件功能单元的形式实现并作为独立的产品销售或使用时,可以存储在一个处理器可执行的非易失的计算机可读取存储介质中。基于这样的理解,本公开的技术方案本质上或者说对现有技术做出贡献的部分或者该技术方案的部分可以以软件产品的形式体现出来,该计算机软件产品存储在一个存储介质中,包括若干指令用以使得一台计算机设备(可以是个人计算机,服务器,或者网络设备等)执行本公开各个实施例所述方法的全部或部分步骤。而前述的存储介质包括:u盘、移动硬盘、只读存储器(read-only memory,rom)、随机存取存储器(random access memory,ram)、磁碟或者光盘等各种可以存储程序代码的介质。
164.最后应说明的是:以上所述实施例,仅为本公开的具体实施方式,用以说明本公开的技术方案,而非对其限制,本公开的保护范围并不局限于此,尽管参照前述实施例对本公开进行了详细的说明,本领域的普通技术人员应当理解:任何熟悉本技术领域的技术人员在本公开揭露的技术范围内,其依然可以对前述实施例所记载的技术方案进行修改或可轻易想到变化,或者对其中部分技术特征进行等同替换;而这些修改、变化或者替换,并不使相应技术方案的本质脱离本公开实施例技术方案的精神和范围,都应涵盖在本公开的保护范围之内。因此,本公开的保护范围应所述以权利要求的保护范围为准。
当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1