这个,那个,这个任务似乎我拖了很久了= =.....先说声抱歉....
2 t7 O/ k9 s+ v1 B5 G) l3 u; [( i+ I8 ~# d% x! Z6 D8 @' `
其实代码很早之前就写了,不过之前调试一直通不过,后来又是复习又是考试的就一直耽搁了...' S' h% T! B! X( h" P( V2 [6 f
& q, z2 {* z+ z
这周末有点空闲,于是狠下心重写了下代码,搞了两天,终于完成了..
% V& W3 x0 Z: T6 S" B* s
9 @% q% u5 R+ l( b0 WBF的文件格式虽然简单,打包器却不是太好做,我觉得还是有必要写写的! v; @+ L3 i, \$ z' I! R/ t3 \
4 O* Y% m8 e7 ]4 D, PBF格式有两个特点:+ P- h" l. I/ J& @0 C" _! H* X' k
其一是文件表的递归存放,这个不算难,Quickbms也可以用
$ h$ q! o+ U3 G: VStart Function XX) W4 T& L9 e# R( I: b9 _
End Function XX
3 G8 ^$ I9 u/ a* K! U2 _Call Function XX
3 m W6 Z2 z8 G* ^6 }来做递归,不过输出读入时文件名前面要加上目录名和/,还是有点小麻烦....$ v8 @1 J2 R% h6 j
$ |' n, u7 e( j7 @% Y; ]/ @
其二是,包文件主体中文件的存放顺序并不是按照文件名表中来的,
4 y' B" y% i$ I' \举个例子,文件名表中,每个文件的内容是这样的:
( r2 L3 v9 d h9 z: n% {文件名长度 文件名 文件大小 偏移量* D9 g3 a$ O( i4 s$ i4 d1 v: y* m
& _+ x' D* h* y0 G, W
也就是说,偏移量才代表了该文件在包中的位置,偏移量最小的文件,就是主体中存放在最前面的,却不是文件名表中的第一个。8 P4 D' k3 s8 f) D. W% @
+ K5 ] N! p' ]! Z5 K& _4 l8 `这是很麻烦的一点。
. e2 } q' V& J$ o2 b; k3 T这样一来,打包的时候就不能按照文件名表中文件顺序来打包,而必须根据偏移量大小顺序来依次打包。
Z0 h1 g0 r! I/ b/ u% ^# ~% `- T; x, O0 U
这儿我用的方法是把每个文件的信息(文件名、大小、偏移)存放到一个结构数组中。# k3 v. m6 Q( W9 q
然后对这个数组按照偏移量做个排序,然后按照排完的顺序依次打包。
+ m, N- n, k7 Z7 Y8 g之前肥牛的图形打包器似乎用了数据库,不过我看不太懂delphi,也不懂数据库....( b6 m7 i* m0 x/ i
- g3 }" p* j( F
目前还存在的问题是,这个打包器无法通用:& D0 s' L7 j/ j# c# J: L8 E
" T- |. A& J4 Q0 Q7 w$ l. J% K
因为文件数量比较大,考虑到排序算法的效率,我用了结构数组做Quicksort,而用数组的话,数组大小(即文件数量)就是确定的值了。如果要大小可变,那么似乎用链表比较合适,不过用链表做quicksort我搞不定....做insertionsort效率又比较低下....不知有没有高人有更好的办法
5 r; `) R. r9 t! z& v/ c% R
9 W; j3 l5 b0 N+ T# h5 l, p0 i不过实际要通用也很容易,之前解包出来后看一下文件数量; e/ c; p9 k; K. U7 B
然后把代码开头 #define FILENUM 760 后面定义的数值改成文件数量,重新编译一下就行了。
. ]7 h7 r9 }# s1 z/ L
, }4 p4 Z, A% K2 ~# t1 W解包脚本,打包器,代码都在压缩包里,打包代码我写了不少注释,欢迎各位高手指正。9 @! w0 Y; o# |, {- X
" G$ z0 w5 E2 k2 \% Q打包器使用方法,和解包后的文件放在同一文件夹下,命令提示符下输入 pack Filename
! d" ]1 m9 n3 H5 K* J! B3 Ifilename即要输出的包文件名 |