最近做了一个打包工具,以自己一个只会单纯读写文件的娃来说,听到特定格式跟地址分布就傻眼了,还好,拥有强大的后援哪,感谢他们。
打包工具第一步:
需要定制格式,虽然本来不是我做的事,但是,自己做了却学到很多。定制格式就是定义一个打包出来的文件的文件头格式。然后是多个文件在打包后的文件中怎么才能更容易的找到某个文件。我是使用了两个结构体,一个DMSGHEADER,跟FILEITEM.结构如下:
typedef struct
{
int id; //文件ID
char type; //类型分'P'/‘E’两类
ULONGLONG offset; //文件起始地址
ULONGLONG length; //文件长度
DWORD checkSum; //文件校验位
BYTE *data; //文件数据
}FILEITEM;
typedef struct
{
BYTE nFlag[8];
DWORD nCheckSum;
ULONGLONG nLength;
}DMSGHEADER;//20个字节
打包第二步:
读取不同文件按照结构体提供的样式将每个文件相关信息读取出来并填充结构体。之前我想的是先全部保存,毕竟文件头的校验位要到最后才能计算出来。而且CFile我没找到已经写个数据的地方可以不擦除插入数据方式。但是在我一次性把所有文件数据(之前全部读取并保存在内存中,当然,我打包的文件不是特别大才采用这种方式的)都加进去打包文件时写进第一个文件成功后,写第二个文件时弹出访问XX(打包的文件路径)未知错误,这个原因一直没找到,可能是第一个文件的文件结束符影响的吧(纯粹个人猜想)。后面就换了种方式,我先不管文件头的校验位有没有计算出来,直接把文件头结构体先写进打包文件(先占好位置),然后按照读一个写一个这种方式把文件相关都写进打包文件中(之前一个老大推荐的读写方式)。写完之后,再来计算文件头所要保存的长度跟校验位。计算好之后,将打包文件的文件指针移动到文件头,然后直接使用write将打包文件头再次写入(此时会覆盖第一次写进去的文件头,不过由于长度相同并且固定,所以不影响整个文件)。
至此:打包文件可以输出了。当然读写文件需要注意new出来的数据都要delete(如果没有delete是不会报错的(释放指向首地址 ,如果地址之后会改变,可以使用一个临时指针先保存该指针的首地址,之后释放delete那个临时指针),所以自己记得去释放new出来的数据),而打开的文件都记得close.