一种文件打包方法及装置的制造方法_2

文档序号:9687436阅读:来源:国知局
包文件进行打包压缩时,不将必要文件的属性写入打包文件,以此可以提高文件的压缩率,实现更好的打包效果。
[0042]需要说明的是,必要文件就是指上述的普通文件。
[0043]图1示出了根据本发明实施例的能提高压缩率的打包方法的流程。
[0044]如图1所示,本发明实施例提供的提高压缩率的打包方法包括步骤:
[0045]S101、根据打包压缩参数遍历目标目录;
[0046]S102、在遍历过程中判断出所述目标目录下的文件或所述目标目录的子目录下的文件为普通文件时,获取所述目标目录下的文件的数据和所述目标目录的子目录下的文件的数据;
[0047]S103、将获取的所述目标目录下的文件的数据和所述目标目录的子目录下的文件的数据写入打包文件并进行压缩。
[0048]其中,所述将获取的所述目标目录下的文件的数据和所述目标目录的子目录下的文件的数据写入打包文件时,舍弃文件的属性信息。
[0049]其中,所述遍历过程中是调用系统函数获取文件的属性,将所述文件的属性填充数据结构后,根据所述数据结构的标识位的取值符合预定条件,判断出所述目标目录下的文件或所述目标目录的子目录下的文件为普通文件。
[0050]该方法还包括:在遍历过程中判断出是所述目标目录的子目录时,获取所述目标目录的子目录的数据,将获取的所述目标目录的子目录的数据写入打包文件并进行压缩;其中,所述子目录的数据包括所述子目录的路径内容与所述子目录的路径长度,不包括子目录下的文件。
[0051]可以发现,利用上述根据本发明提供的文件打包方法及装置,通过在遍历过程中先判断所述目标目录下的文件或所述目标目录的子目录下的文件的类型,判断出是普通文件后将普通文件作为必要文件,非普通文件则为非必要文件,舍弃非必要文件,只将必要文件写入打包文件进行打包和压缩,可以提高文件压缩率,解决现有技术存在的问题。进一步的,在判断出普通文件作为必要文件后,舍弃必要文件的属性的数据(即非文件内容数据),即不将这些属性写入打包文件,从而进一步提高文件压缩率。
[0052]为了更详细地说明本发明实施例提供的提高压缩率的打包方法,图2示出了根据本发明实施例的提高压缩率的打包方法的详细流程。
[0053]如图2所示,本发明实施例提供的提高压缩率的打包方法,包括以下步骤:
[0054]步骤S201:根据打包压缩参数遍历目标目录。
[0055]其中,压缩参数是用户设定的,设定压缩参数的目的在于用户选定一个目录作为目标目录,并将目标目录作为遍历的起始目录。
[0056]步骤S202:遍历目标目录。
[0057]本发明实施例使用深度优先搜索方式对目标目录进行遍历,而深度优先搜索方式采用递归算法,例如,目标目录下有A、C两个子目录,A目录的排序比C目录靠前,那么使用深度优先搜索的方式的遍历顺序为,先遍历完A目录下的文件后,再以A目录作为根目录,遍历A目录下的子目录,再继续以深度优先遍历A目录下子目录下的文件,直到遍历完A目录下所有的元素,然后开始遍历C目录下的元素,同样采用深度优先搜索的方式遍历C目录下的元素。
[0058]遍历目标目录的目的在于读取目标目录中的子目录与文件,为后续的打包压缩工作做准备。
[0059]步骤S203:通过调用系统函数lstat获取文件的属性,通过属性判断遍历读取的内容为子目录或文件,如果为子目录,则进入步骤S204 ;如果为文件,则进入步骤S205。
[0060]需说明的是,直接根据文件的属性可以判断是属于子目录还是属于文件,而文件的属性可以通过调用系统函数得到,例如调用系统函数lstat。
[0061]需要说明的是,目标目录下的内容只有两种,一种是子目录,另一种是目标目录下的文件,而子目录下也可能包含文件,所以上述文件即包括目标目录下的文件又包括子目录下的文件。
[0062]步骤S204:读取子目录的路径内容,计算该子目录的路径长度,将计算出的该子目录的路径长度与读取出的子目录的路径内容写入打包文件,再将该子目录作为目标目录,循环步骤S202-步骤S203。
[0063]由于15个bit最大能表示整数32768,也就是最大可以保存整数32768,而Linux操作系统下最大的路径长度是4096个字节,相当于整数4096,因此,本发明实施例的路径长度占用15个bit,足够保证Linux操作系统下的路径长度。
[0064]为了在解压缩时--对应目录和文件,在打包压缩时需要对目录和文件进行标记,对本发明实施例用一个bit表示路径是子目录还是文件,如果路径是子目录,将bit置为1,如果路径是文件,将bit置为0。
[0065]因此,本发明实施例路径长度占用磁盘空间两个字节,共16个bit,第一个bit用来标记路径是子目录或文件,而后面的15个bit用于存储路径长度。
[0066]获取路径的路径内容就会得到路径长度,例如:获取的路径内容为abcd,这个路径由“a、b、c、d” 4个ASCII字符组成,即由4个字节组成,那么这个路径的路径长度为4,艮P“路径长度占15个bit空间中所保存的内容为整数“4”,如果这个路径是一个目录,所以第1个bit置为1 ;如果这个路径是一个文件,则第一个bit置为0。
[0067]路径内容所占的空间是变化的,具体变化的长度由前面占用15bit的路径长度的取值所决定比如:一个路径由100个字符组成,那么这个路径将占据100个字节,路径长度占15个bit空间中所保存的内容为整数“100”,另一个路径由20个字符组成,那么此路径将占据20个字节,路径长度占15个bit空间中所保存的内容为整数“20”。
[0068]路径长度后面跟的是路径内容长度,路径内容长度是路径下的内容的长度,也就是路径下的内容实际占用磁盘空间的长度。
[0069]步骤S205:判断文件是否为普通文件,如果为普通文件,则进入步骤S206 ;如果不为普通文件,则舍弃该文件。
[0070]该步骤的判断过程:调用系统函数获取文件的属性,将所述文件的属性填充数据结构后,根据所述数据结构的标识位的取值符合预定条件,判断出所述目标目录下的文件或所述目标目录的子目录下的文件为普通文件。具体的:
[0071]调用系统函数lstat,传入当前文件路径,函数把返回的属性信息填入stat结构,本发明通过判断 stat.st_mode 中 S_IFREG 的位是否是 1 (即(stat.st_mode&S_IFREG) >0),如果是,则表示当前文件为普通文件。需说明的是,这里是以取值为1举例说明,也可以是设定其他取值对应判断出是普通文件。
[0072]该步骤根据文件的属性判断遍历得到的文件是不是普通文件,如果遍历得到的文件不是普通文件,将其归类为其它文件,为了在Hybrid架构使用场景下提高压缩率,本发明实施例舍弃非必要的文件,也就是其它文件,舍弃其它文件意味着不对于其它文件进行处理,只保留普通文件进行压缩,以此达到更极致的压缩率。
[0073]步骤S206:在判读出是普通文件后,读出文件的路径内容和文件的内容,计算文件的路径长度和文件的内容长度,将计算出的文件的路径长度、文件的内容长度、读出的文件的路径内容、文件的内容写入打包文件,而对于文件的属性信息,如文件访问权限、所有者信息、组信息、最后修改时间等信息,则不写入打包文件,这样可以减少需压缩的内容,进一步提高压缩率。
[0074]其中,文件的路径长度计算方法与上述子目录的路径长度计算相同,故不再重复。
[0075]而文件的内容长度用4个字节表示,即占用磁盘4个字节,最大可表示整数4294967295,即文件的内容长度占4个字节的空间中所存的内容为整数“4294967295”,意味着单个文件内容最大可以支持4G。
[0076]例如,遍历过程中遇到一个文件内容长度为100个字节,那么这4个字节存储的内容就是整数“100”,整数“100”实际上用1个字节就足够存储了,但这里协议必须保证前后一致,所以仍然使用4个字节保存这个长度,如果一个文件内容刚好有4G大小,那么这4个字节也足够存储4G,即“4294967295”这个整数。
[0077]文件的内容长度是变化的,具体变化的长度由前面4个字节的文件内容长度的取值所决定,例如:
[0078]如果a/b/test.txt文件只包含了“XYZ”3个字符,则这个文件的内容长度为3,那么文件的内容长度占4个字节的空间中所存的内容为整数“ 3 ”;紧跟文件内容长度后面的3个字节的内容为“ΧΥΖ”,即这个文件的内容占用了 3个字节。
[0079]如果a/b/test.txt文件中只包含了 “AB⑶EFG”
当前第2页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1