这个,那个,这个任务似乎我拖了很久了= =.....先说声抱歉....
% s" K m% s+ o$ y
% y: V6 c, [( c' Q其实代码很早之前就写了,不过之前调试一直通不过,后来又是复习又是考试的就一直耽搁了..." k' g3 d. K6 p+ i8 a
* d" f: s* y( ^$ h这周末有点空闲,于是狠下心重写了下代码,搞了两天,终于完成了..# H+ \- X1 s2 ^- k
6 f3 T3 p7 Z9 Y8 y2 M# q5 X# fBF的文件格式虽然简单,打包器却不是太好做,我觉得还是有必要写写的. u) o- }4 Y+ c
2 G$ u" F/ c: z" ]( Y
BF格式有两个特点:
+ O4 g. S+ M" M& N7 ^7 s8 ?其一是文件表的递归存放,这个不算难,Quickbms也可以用
. R5 _% V* S& z5 t/ T$ iStart Function XX
! B" I) T4 F9 u2 sEnd Function XX
5 C+ y4 ?2 J" mCall Function XX* d/ T* K/ a: K) T R
来做递归,不过输出读入时文件名前面要加上目录名和/,还是有点小麻烦....0 h/ ?; W; K8 `9 v- [$ z' Q
6 S' ]$ A/ s4 G- Z2 D其二是,包文件主体中文件的存放顺序并不是按照文件名表中来的,& Q' F! [. p2 |2 @. O, m& t
举个例子,文件名表中,每个文件的内容是这样的:
3 K1 l/ C' Y F, Q文件名长度 文件名 文件大小 偏移量
0 V+ j7 m- [! l" T- i' M. g# x
9 S. ?- d+ N9 ~* |1 d9 v也就是说,偏移量才代表了该文件在包中的位置,偏移量最小的文件,就是主体中存放在最前面的,却不是文件名表中的第一个。4 S' o; t6 L8 i
' G# S/ E9 r, p. Z这是很麻烦的一点。
: V5 y0 f G2 J& {, \- z3 x% J4 r这样一来,打包的时候就不能按照文件名表中文件顺序来打包,而必须根据偏移量大小顺序来依次打包。
0 a7 d5 D6 ^& c2 S3 l/ X4 S/ V }' ^6 d/ {+ Y# X- f% N8 ]7 b
这儿我用的方法是把每个文件的信息(文件名、大小、偏移)存放到一个结构数组中。
. ]2 N& O$ M3 F, c( i5 H0 B* j然后对这个数组按照偏移量做个排序,然后按照排完的顺序依次打包。
/ @7 p! l4 I, x6 M9 W之前肥牛的图形打包器似乎用了数据库,不过我看不太懂delphi,也不懂数据库....
9 ^$ ?& m: Z5 g+ M; h- s9 z4 h& F6 ~- B' B
目前还存在的问题是,这个打包器无法通用:
# o+ o4 i9 G& q" s+ e* |: E$ t6 b$ u8 R- r1 m5 F q( ]& p
因为文件数量比较大,考虑到排序算法的效率,我用了结构数组做Quicksort,而用数组的话,数组大小(即文件数量)就是确定的值了。如果要大小可变,那么似乎用链表比较合适,不过用链表做quicksort我搞不定....做insertionsort效率又比较低下....不知有没有高人有更好的办法, Q3 Y% S1 n( l0 g' l
, y2 h; V+ r3 i' W0 r- p不过实际要通用也很容易,之前解包出来后看一下文件数量
" A9 \# F1 i6 a' I$ t然后把代码开头 #define FILENUM 760 后面定义的数值改成文件数量,重新编译一下就行了。. i6 W1 A2 I6 {0 n3 [6 q" M
8 o. K0 w$ f& ~5 D解包脚本,打包器,代码都在压缩包里,打包代码我写了不少注释,欢迎各位高手指正。
5 |; ~: ~8 p) i% J& E2 h
/ ~& I1 j% x4 A打包器使用方法,和解包后的文件放在同一文件夹下,命令提示符下输入 pack Filename6 E. Q7 Q- Z$ O4 t2 b
filename即要输出的包文件名 |