发明内容
有鉴于此,本发明的主要目的在于提供一种文件匹配方法,用于解决现有技术中匹配效率低、匹配速度慢、缺乏内容一致性的验证以及不能进行不同目录结构文件内容的交叉比较的技术问题,为达到上述目的,本发明的技术方案是这样实现的:
一种单向多射文件匹配方法,包括:
A、采集比对目录中的文件信息分别形成第一内存匹配对象和第二内存匹配对象;
B、循环从第一内存匹配对象中获取每个文件所对应的元素对象,并从所述元素对象中读取文件名属性值,然后将其与第二内存匹配对象中的每个元素对象中的文件名属性值进行比较,二者相等时,将这一对文件的文件名、相对路径和/或绝对路径写入文件名匹配列表文件中;
C、基于所述文件名匹配列表文件,对文件名匹配成功的文件的文件内容进行一致性验证;
D、输出一致性验证通过的文件信息。
进一步地,步骤A中,形成所述第一内存匹配对象和第二内存匹配对象的步骤具体为:
A1、采集比对目录中的文件信息分别形成文件信息列表文件;
A2、从文件信息列表文件中读取文件信息分别在内存中建立第一内存匹配对象和第二内存匹配对象。
进一步地,所述文件信息至少包括文件名及相对路径和/或绝对路径,所述文件信息列表文件为内存文件或磁盘文件。
进一步地,步骤A中,采集比对目录中的文件信息具体为:
对两个比对目录分别做广度优先的周游,针对每个比对目录下发现的每一个文件记录文件名、相对路径和/或绝对路径。
进一步地,所述第一内存匹配对象和第二内存匹配对象为向量对象、数组对象或列表对象。
进一步地,步骤A中,所述文件信息中包含文件大小,步骤C中,首先判断文件名匹配成功的文件的文件大小是否一致,如果文件大小不一致则内容不一致;否则继续执行内容一致性的验证。
进一步地,所述对文件名匹配成功的文件的文件内容进行一致性验证的步骤为:
计算文件名匹配成功的文件内容的MD5值,然后判断所述MD5值是否相同;或,
对文件名匹配成功的文件内容进行二进制的比对,判断二进制内容是否相同。
进一步地,步骤D中,所述输出的一致性验证通过的文件信息的内容至少包括文件名、相对路径和/或绝对路径。
本发明在对比对目录及比对目录下的子目录中的所有文件进行匹配时,先从磁盘读取比对目录下的所有文件名称形成内存列表,然后在内存中进行文件名称的匹配,对名称匹配成功的文件再进行内容的一致性验证。本发明能以极小的磁盘读写开销进行大批量文件的匹配,效率极高,而且在提高匹配效率的同时避免了重复磁盘访问从而延长了磁盘的使用寿命。
具体实施方式
为使本发明的目的、技术方案和优点更加清楚明白,以下举实施例并参照附图,对本发明进一步详细说明。
图1为本发明所述方法的步骤流程图,本实施例中两个比对目录分别为目录A和目录B,目录A和目录B下的目录层次不受限制,目录A和目录B的目录结构也可完全不一样,对目录A和目录B下的文件个数和文件类型也不做限制。
步骤1:采集比对目录中的文件信息分别形成文件信息列表文件;
本步骤的目的是将两个比对目录中的所有待匹配文件的文件信息提取出来分别形成两个列表文件,文件信息至少包括文件名、绝对路径。形成的列表文件可以是一个内存文件也可以是一个磁盘文件。
采集比对目录A和B的文件信息的方式如下:
对目录A做一次广度优先的周游,针对发现的每一个文件记录下文件名,相对路径和/或绝对路径等文件信息,写入列表文件A.lst;
对目录B做一次广度优先的周游,针对发现的每一个文件记录下文件名,相对路径和/或绝对路径等文件信息,写入列表文件B.lst;
该步骤中,如果目录A和/或目录B中的文件数较少,形成的列表文件所占用内存空间较小的话,可以将形成的列表文件存储在内存当中,这样可以减少磁盘读写,且在内存中操作速度快、效率高,如果需要保留备份可将其存成文件。
步骤2:依据所述比对目录的文件信息分别生成内存匹配对象;
本步骤中将文件信息分别从两个文件信息列表文件中提取出来形成两个内存匹配对象的目的是在内存中执行文件名称的匹配,所述内存对象可以是向量对象、数组对象或列表对象等。
打开列表文件A.lst,提取目录A下的所有文件的文件名及路径信息存入内存中的向量Vector_A,每一个文件的文件信息为向量Vector_A中的一个向量元 素。关闭列表文件A.lst,而Vector_A留在内存中等待运算;
打开列表文件B.lst,提取目录B下的所有文件的文件名及路径信息存入内存中的向量Vector_B,每一个文件的文件信息为向量Vector_B中的一个向量元素。关闭列表文件B.lst,而Vector_B留在内存中等待运算;
如果在步骤1中,不需要保存列表文件,则可直接在内存中生成向量Vector_A和向量Vector_B,这样执行效率会更高。
步骤3:基于所述内存匹配对象执行文件名匹配;
本步骤所述的文件名匹配是指单向多映射关系的匹配,即目录A中的每个文件可能在目录B中拥有多个目标文件,且可能每个目标文件都位于不同的子目录当中。本步骤的目的是进行两个分别对应目录A和目录B的内存匹配对象的文件名称匹配,从而获得文件名称匹配的匹配结果集,文件名称匹配可以是完全相同或符合设定的匹配条件等。将匹配结果集存入列表文件Found.lst中。如果列表文件不大可驻留内存。
以内存匹配对象采用向量为例,本步骤的执行方法如下:
循环弹出Vector_A向量元素,取出向量元素中的文件名属性值,然后与Vector_B中的每个向量元素的文件名属性值进行比较,如果相等,则将这一对文件的绝对路径及文件名称等内容写入列表文件Found.lst中;
针对Vector_A中的每一项mLstLine_A,重复上述操作;
步骤4:对文件名匹配成功的文件进行一致性验证,输出一致性验证通过的文件信息;
本步骤的目的是对文件名称匹配的文件进行文件内容本身的比对,判断文件内容是否相同,从而得到文件名称匹配且实际内容也完全一致的文件列表。
对文件内容一致性的验证可以采用对文件整体计算MD5值,然后比对所得MD5值是否相同;或直接对文件内容进行二进制比对;或计算校验码然后判断校验码是否相同;或提取文件信息(例如文件字节大小、文件修改时间等)进行比对等。
以下以计算MD5值的比对方式为例进行说明:
步骤401、打开文件Found.lst,形成列表对象;
步骤402、从列表对象中提取一个包含目录A和目录B中文件名称相同的文件的文件名、绝对路径等信息的列表项;
步骤403、通过绝对路径打开磁盘文件,计算列表项所对应的两个比对文件的MD5值;
步骤404、如果两个文件的MD5值相同,就将这一对文件的路径信息和MD5值作为一个列表项写入Pair.lst列表文件中;然后执行步骤402,直到处理完Found.lst中的所有列表项。
步骤405、输出Pair.lst列表文件。
Pair.lst列表文件中,记录了目录A和目录B中所有同名且文件内容一致的文件的射关系;
作为改进,本发明一优选的实施例在进行文件内容一致性验证时,首先判断文件属性是否发生变化,如果变化则说明内容不一致,否则再执行内容一致性的验证,所述文件属性指文件修改时间、文件大小等能够标识文件发生变化的文件属性。
本发明在步骤1中一次读取所有文件的文件信息,在步骤2中进行批量的文件匹配处理,从而避免了对每一个文件进行匹配时读每次都得读取磁盘中文件信息的操作,尤其是在目录B中的文件数量庞大的情况下,本发明的所述方法的处理速度要远远高于传统的匹配方法。在文件数量小的情况下,列表文件都可以内存文件的形式进行操作,使用完即可释放,从而进一步提高了处理的速度和效率。此外,本发明不限制比对目录的目录结构,即使名称匹配且内容一致的文件位于比对目录下完全不同的子目录中,通过本发明也可很快的找到,而且可以通过输出的列表文件清楚的反映出文件之间的映射关系,大大节省了开发人员在反向工程时查找相同文件的时间。
实施例1:
计算机环境:单核3GHz CPU,内存512MB,5400转IDE接口硬盘,FAT32文件系统;
A目录下文件数是3512,占用空间约400MB,采用本发明的技术方法,对目录A进行一次广度优先的遍历时间是:1秒,生成的A.lst文件内容格式示例如下:
|开始时间:2008-11-04 11:58:11
|绝对路径|相对路径|文件名
|文件总数:3512
|结束时间:2008-11-04 11:58:12
B目录下文件数是464304,占用空间约29G,采用本发明的技术方法,对目录B进行一次广度优先的遍历时间是:162秒,生成的B.lst文件内容格式示例如下:
|开始时间:2008-11-04 11:58:12
|绝对路径|相对路径|文件名
|文件总数:464304
|结束时间:2008-11-04 12:00:54
采用本发明的方法,对目录A和目录B进行同名文件匹配,发现9479对同名文件,对9479对同名文件分别计算MD5,用去大约14分钟;
对同名文件的MD5值进行比较的时间是1秒;输出的Pair.lst文件格式示例如下:
|开始时间:2008-11-04 12:14:29
|文件名|MD5|绝对路径【B】|绝对路径【A】
|MD5匹配的文件对数量:9479
|MD5匹配的唯一文件数:3391
|结束时间:2008-11-04 12:14:30
通过本发明的方法,对目录A下3512个文件中与目录B下464304个文件进行比对后,发现有3391个文件找到了自己的全部出处,而用时总共约16分钟。若采用现有技术对目录A中的每一文件在目录B中进行一次检索和比对,则至少大于3512*162/60=9482分钟,可见效果是非常明显的,提高了检索 的效率和减低了对硬件的要求,同时节省了人力,让看似不能处理的任务也能完成。
实施例2:
在做文件的备份与恢复的时候,通常会遇到这样的情况,即在本地硬盘的D盘放了很多文件,而其中一部分已经在移动硬盘里有了备份,假如想将移动硬盘里已经存在的文件从D盘移除,同时还要保证其他文件不受影响,不管是通过现有文件同步工具还是通过通过人工,要将这些随机分布在D盘的淹没在文件海洋中的文件一一查找出来是一件非常费时费力的工作;有时候,在移动硬盘里的一个文件,在D盘里会有多个相同文件对应,而且分散在不同的目录下,通过本发明可以对两个完全不同目录结构的文件目录进行单向多射的匹配,从而能快速找出所有在D盘中文件名称相同而且内容完全一致的存储于任何目录下的文件,而且速度快、准确率高,避免了用户繁琐的劳动。
实施例3:
一家软件公司发行的软件在使用过程中发现了缺陷,现场维护人员通过检测工具发现缺陷是由一些动态链接库(dll)文件引起的,他们把问题文件的列表传回了公司;技术人员需要对列表中提到的这些dll文件进行定位,由于这些文件分散在源码目录下的不同模块中;为了找到这些文件在源代码目录中的出处,可以通过本发明快速、高效的来完成操作工作。处理的步骤如下:
(1)把这些有问题的dll文件从安装目录里找出来,拷贝到一个新建的目录A中,目录A作为源目录;
(2)将源代码目录作为B目录,即比对目录;
(3)使用采用本发明技术方案实现的单向多射文件匹配工具,快速地从B目录中查找到所有出现这些dll文件的地方,从而帮助开发人员快速地定位问题的所在并开始修改和调试步骤。
通过本发明可以使问题定位更加高效、准确,提升了开发效率。
以上所述,仅为本发明的较佳实施例而已,并非用于限定本发明的保护范围。