这个,那个,这个任务似乎我拖了很久了= =.....先说声抱歉....
# ^5 j' g$ r+ V
# |1 a+ p0 Y+ k9 i* C其实代码很早之前就写了,不过之前调试一直通不过,后来又是复习又是考试的就一直耽搁了...! @& i0 Y$ d' r2 y- r* W D
# N2 q+ Z2 s6 b这周末有点空闲,于是狠下心重写了下代码,搞了两天,终于完成了..
: ^" g5 b, L" U$ x# b1 k- r. u* A
3 I" y. i3 I5 |" q) nBF的文件格式虽然简单,打包器却不是太好做,我觉得还是有必要写写的
, z4 u/ p% j s+ E/ e& ]" A% x% b3 c8 v+ _5 ]2 l
BF格式有两个特点:
& R6 Q+ u+ D8 V$ f5 h3 R其一是文件表的递归存放,这个不算难,Quickbms也可以用
* z* ?, C# A$ O: l3 l4 O+ wStart Function XX
! p) w- g; k4 d1 T. W3 a$ YEnd Function XX- D4 c" g6 Y" z) i) y! P: h
Call Function XX5 _: q4 Y3 L3 K
来做递归,不过输出读入时文件名前面要加上目录名和/,还是有点小麻烦....
: | b+ ?. F/ F: ?+ c# }' x% Y, |, J' ?! F5 h; a
其二是,包文件主体中文件的存放顺序并不是按照文件名表中来的,/ o% |" Q8 \9 p
举个例子,文件名表中,每个文件的内容是这样的:0 ]& s" p% j' |
文件名长度 文件名 文件大小 偏移量
' v9 c$ V7 x& ?2 F1 n) w9 Q8 l, O4 T! }6 }1 p
也就是说,偏移量才代表了该文件在包中的位置,偏移量最小的文件,就是主体中存放在最前面的,却不是文件名表中的第一个。9 _/ q" t9 I- @; {1 P4 V
6 ^* Q0 ~# w5 z+ n" r8 d2 a6 g这是很麻烦的一点。$ v1 f' \5 {, O/ ~
这样一来,打包的时候就不能按照文件名表中文件顺序来打包,而必须根据偏移量大小顺序来依次打包。' e% ?$ A$ Q2 ~* f4 v. d
7 q; ^) ]; n9 |" @" x. |& J. a
这儿我用的方法是把每个文件的信息(文件名、大小、偏移)存放到一个结构数组中。
6 Y( z6 }7 {0 Y3 s+ b3 h# _9 |1 F然后对这个数组按照偏移量做个排序,然后按照排完的顺序依次打包。$ c! ^- ^; i! B4 e `* J& x
之前肥牛的图形打包器似乎用了数据库,不过我看不太懂delphi,也不懂数据库..../ o6 w- G1 K+ y
' A# M( J+ Z4 C
目前还存在的问题是,这个打包器无法通用:
0 K: ]. f: N2 V3 M* ?4 W& i/ J, l( x
因为文件数量比较大,考虑到排序算法的效率,我用了结构数组做Quicksort,而用数组的话,数组大小(即文件数量)就是确定的值了。如果要大小可变,那么似乎用链表比较合适,不过用链表做quicksort我搞不定....做insertionsort效率又比较低下....不知有没有高人有更好的办法4 g8 r( Y& t7 a6 j9 N' A
* L3 ?1 f, z8 L
不过实际要通用也很容易,之前解包出来后看一下文件数量7 D. U1 S; h( [
然后把代码开头 #define FILENUM 760 后面定义的数值改成文件数量,重新编译一下就行了。* `: U- E$ w+ P/ X7 U3 I* |
3 `* k3 S3 Y5 b0 Z& ^% @9 b解包脚本,打包器,代码都在压缩包里,打包代码我写了不少注释,欢迎各位高手指正。9 U4 H4 X2 L4 C
$ U6 U. m. _, v) P
打包器使用方法,和解包后的文件放在同一文件夹下,命令提示符下输入 pack Filename8 s) t% v. p* @2 {
filename即要输出的包文件名 |