输入一个文件名列表,把这些文件打包生成一个目标文件。所生成的目标文件包含各个输入文件的信息,包括文件名,文件长度,各个文件的数据在目标文件的位置等信息,具体格式自己定义。函数声明如下:int fpack(const char *flist[], const char *dstfile),其中,flist为文件名列表,以NULL为结束,比如{"file1.txt”,"file2.txt”,"file3.txt”...NULL}; detfile为打包生成的目标文件名,成功返回0,失败返回-1
struct FILEINFO
{
char name[20];
char size[10];
char addr[256];
};
#define MAX_SIZE 2048
int fpack(const char *flist[], const char *dstfile)
{
char readBuf[MAX_SIZE];
memset(readBuf, 0, sizeof(readBuf));
int filesize = 0;//某个文件的大小
int len = 0; //读取内容的长度
FILEINFO fileInfo;
FILE *fout = fopen(dstfile, "a+");
if(fout == NULL)
{
printf("%d fopen file %s failed\n", __LINE__, dstfile);
return -1;
}
FILE *fin;
int i = 0;
while(flist[i] != NULL)
{
memset(&fileInfo, '0', sizeof(FILEINFO));
fin = fopen(flist[i], "r");
if(fin == NULL)
{
printf("%d fopen file %s failed\n", __LINE__, flist[i]);
return -1;
}
while((len = fread(readBuf, sizeof(char), MAX_SIZE, fin)) > 0)
{
filesize +=len;
memset(readBuf, 0, sizeof(readBuf));
len = 0;
}
strcpy(fileInfo.addr, flist[i]);
strcpy(fileInfo.name, flist[i]);
sprintf(fileInfo.size, "%d", filesize);
fwrite(&fileInfo, sizeof(FILEINFO), 1, fout);
printf("The file:%s's size is %d.\n", flist[i], filesize);
fclose(fin);
i++;
}
printf("fileNum = %d\n", i);//文件的个数
fclose(fout);
return 0;
}
int main(int argc, char* argv[])
{
const char *flist[] = {"in0.txt", "in1.txt", "in2.txt", "in3.txt", "in4.txt", NULL};
printf("%d, %d\n",sizeof(flist),sizeof(flist)/sizeof(flist[0]));
fpack(flist,"out.txt");
return 0;
}