📄 fmerge.c
字号:
the name of each argument: FileName;
Return: Success:1, Failure: 0
*/
int Delete_IMGfile(int Num_Files, char **FileName)
{ FILE *destFile;
int ret_value=0, flag=0;
int i,j;
long lthDestFile, offset, offset_rec;
struct stat File_Statbuf;
char *imgFileName;
HdZAR header;
int chi;
char *rw_buf;
/*Open the destination file to append a new Img file. The destination
file was opened use Read_Only to determin whether the file has existed.*/
destFile = fopen(FileName[Num_Files-1], "r+b");
/*Create the file if it is not existed*/
if (destFile == NULL)
{ printf("Cannot open the destfile: --%s-- \n", FileName[Num_Files-1]);
return ret_value;
}
lthDestFile=checkDestFile(destFile,&File_Statbuf);/*Check the destination file if it is the specified format*/
if (lthDestFile ==0)
{ fclose(destFile);
return 0;
}
if ((rw_buf=(char *)malloc(RW_BYTES*sizeof(char)))==NULL)
{ printf("Delete Files: Not enough memory!\n");
fclose(destFile);
return ret_value;
}
for (i=2; i<Num_Files-1; i++)
{ imgFileName = FileName[i];
flag = Fd_Position(destFile, FileName[i]);
if (flag ==1)
{ fread (&header.fname,1,MAXFILE+MAXEXT,destFile);
header.flength = Read_From_File(destFile);
header.srcflength = Read_From_File(destFile);
/* header.creatTime=Read_From_File(destFile);*/
header.modifyTime=Read_From_File(destFile);
offset= header.flength;
offset_rec=ftell(destFile)-sizeof(HdZAR);
fseek(destFile,offset,SEEK_CUR);
ret_value = 1;
chi=fgetc(destFile);
while (chi!=EOF)
{ fseek(destFile, -1, SEEK_CUR);
fread (&header.fname,1, MAXFILE+MAXEXT, destFile);
header.flength = Read_From_File(destFile);
header.srcflength = Read_From_File(destFile);
/* header.creatTime=Read_From_File(destFile);*/
header.modifyTime=Read_From_File(destFile);
fseek(destFile, 0-sizeof(HdZAR)-offset-sizeof(HdZAR), SEEK_CUR);
fwrite(header.fname, 1, MAXFILE+MAXEXT, destFile);
Put_To_File(header.flength,destFile);
Put_To_File(header.srcflength,destFile);
/* Put_To_File(header.creatTime,destFile);*/
Put_To_File(header.modifyTime,destFile);
offset_rec=offset_rec+sizeof(HdZAR);
for (j=0;j< header.flength/RW_BYTES;j++)
{ fseek(destFile, offset+sizeof(HdZAR), SEEK_CUR);
fread(rw_buf,1,RW_BYTES,destFile);
fseek(destFile, -RW_BYTES-(long)sizeof(HdZAR)-offset, SEEK_CUR);
fwrite(rw_buf, 1, RW_BYTES, destFile);
offset_rec=offset_rec+RW_BYTES;
}
if (header.flength%RW_BYTES!=0)
{ fseek(destFile, offset+sizeof(HdZAR), SEEK_CUR);
fread(rw_buf,1,header.flength%RW_BYTES,destFile);
fseek(destFile, -(header.flength%RW_BYTES)-(long)sizeof(HdZAR)-offset, SEEK_CUR);
fwrite(rw_buf, 1, header.flength%RW_BYTES, destFile);
offset_rec=offset_rec+header.flength%RW_BYTES;
}
fseek(destFile, offset+sizeof(HdZAR), SEEK_CUR);
chi=fgetc(destFile);
}/*end of while (chi!=EOF)*/
fflush(destFile);
#ifdef VxWorks
ftruncate(fileno(destFile), offset_rec);
#else
chsize(fileno(destFile), offset_rec);
#endif
fclose(destFile);
destFile = fopen(FileName[Num_Files-1], "rb+");
fseek(destFile,1L,SEEK_SET);
printf("File -%s- has been deleted from the destination file %s\n", imgFileName, FileName[Num_Files-1]);
}/*end of if (flag == 1)*/
else
printf("file %s cannot find in the destFile %s\n", imgFileName, FileName[Num_Files-1]);
}
free(rw_buf);
fclose(destFile);
return ret_value;
}
/*Display the information of the Img file(s) in the destination file
Input: The number of the arguments: Num_Files
the name of each argument: FileName;
Return: Success:1, Failure: 0
*/
int Display_IMGfiles(int Num_Files, char **FileName)
{ FILE *destFile;
int ret_value=0, chi, filenum=0, nCnt;
long lthDestFile;
struct stat File_Statbuf;
HdZAR header;
char buf[25], tmp[512];
struct tm *tp;
destFile = fopen(FileName[Num_Files-1], "rb");
if (destFile==NULL)
{ printf ("Error in opening dest file\n");
return ret_value;
}
lthDestFile=checkDestFile(destFile,&File_Statbuf);
if (lthDestFile ==0)
{ fclose(destFile);
return 0;
}
printf("--Last Modify Time-------File Size---------File Name--\n");
for (;;)
{ chi = fgetc(destFile);
if (chi != EOF)
{ fseek(destFile, -1, SEEK_CUR);
fread (&header.fname,1, MAXFILE+MAXEXT, destFile);
header.flength = Read_From_File(destFile);
header.srcflength = Read_From_File(destFile);
/* header.creatTime=Read_From_File(destFile);*/
header.modifyTime=Read_From_File(destFile);
tp=localtime(&header.modifyTime);
strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S",tp);
printf ("%s %10ld %16s\n",buf,header.flength,header.fname);
/*fseek(destFile,header.flength,SEEK_CUR);*/
for(nCnt=0;nCnt<header.flength/512;nCnt++)
fread(tmp, 1,512,destFile);
if (header.flength%512!=0)
fread(tmp,1,header.flength%512,destFile);
filenum++;
if (ftell(destFile)>= lthDestFile)
break;
}
else
break;
}
fclose(destFile);
if (filenum==0)
ret_value = 0;
else
ret_value=1;
return ret_value;
}
/*Extract all the Img file(s) from the destination file
Input: The number of the arguments: Num_Files
the name of each argument: FileName;
Return: Success:1, Failure: 0
*/
int Extract_Files(int Num_Files, char **FileName)
{ HdZAR header;
int ret_value=0, chi;
long lthDestFile;
FILE *destFile;
char curdir[MAXDIR], buf[25],*rw_buf;
struct stat File_Statbuf;
struct tm *tp;
getcwd(curdir, MAXDIR+MAXDRIVE);
strcat(curdir,"\\");
if ((destFile=fopen (FileName[Num_Files-1],"rb"))==NULL)
{ printf ("Error in opening dest file\n");
return ret_value;
}
lthDestFile=checkDestFile(destFile,&File_Statbuf);
if (lthDestFile==0)
{ fclose(destFile);
return ret_value;
}
printf("Extracting Files ... ... ... ...\n");
if ((rw_buf=(char *)malloc(RW_BYTES*sizeof(char)))==NULL)
{ printf("Extract Files: Not enough memory!\n");
fclose(destFile);
return ret_value;
}
printf("--Last Modify Time-------File Size---------File Name--\n");
fseek(destFile, 1, SEEK_SET);
for (;;)
{ char path[MAXDRIVE+MAXDIR+MAXFILE+MAXEXT];
FILE *tmpImg;
register long loop;
struct utimbuf times;
path[0]='\0';
strcpy (path,curdir);
chi = fgetc(destFile);
if (chi != EOF)
{ ret_value = 1;
fseek(destFile, -1, SEEK_CUR);
fread (&header.fname,1, MAXFILE+MAXEXT, destFile);
header.flength = Read_From_File(destFile);
header.srcflength = Read_From_File(destFile);
/* header.creatTime=Read_From_File(destFile);*/
header.modifyTime=Read_From_File(destFile);
tp=localtime(&header.modifyTime);
strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S",tp);
printf ("%s %10ld %16s\n",buf,header.flength,header.fname);
strcat (path, header.fname);
tmpImg=fopen (path,"wb");
for (loop=0;loop< header.flength/RW_BYTES;loop++)
{ fread(rw_buf,1,RW_BYTES,destFile);
fwrite(rw_buf, 1, RW_BYTES, tmpImg);
}
if (header.flength%RW_BYTES!=0)
{ fread(rw_buf,1,header.flength%RW_BYTES,destFile);
fwrite(rw_buf, 1, header.flength%RW_BYTES, tmpImg);
}
fclose ( tmpImg);
times.modtime = times.actime = header.modifyTime;
utime(path,×);
}
else
break;
}
free(rw_buf);
fclose(destFile);
return ret_value;
}
/*Extract the specified Img file(s) from the destination file
Input: The number of the arguments: Num_Files
the name of each argument: FileName;
Return: Success:1, Failure: 0
*/
int Extract_Some_Files(int Num_Files, char **FileName)
{ HdZAR header;
FILE *pImgfile, *destFile;
char path[MAXDRIVE+MAXDIR+MAXFILE+MAXEXT];
char *imgFileName;
register long loop;
long lthDestFile;
struct utimbuf times;
int ret_value=0, i=0, chi, flag=0;
char curdir[MAXDIR], buf[25], *rw_buf, ch;
struct stat File_Statbuf;
struct tm *tp;
getcwd(curdir, MAXDIR+MAXDRIVE);
strcat(curdir,"\\");
if ((destFile=fopen (FileName[Num_Files-1],"rb"))==NULL)
{ printf ("Error in opening dest file\n");
return ret_value;
}
lthDestFile=checkDestFile(destFile,&File_Statbuf);
if (lthDestFile ==0)
{ fclose(destFile);
return 0;
}
if ((rw_buf=(char *)malloc(RW_BYTES*sizeof(char)))==NULL)
{ printf("Extract Some Files: Not enough memory!\n");
fclose(destFile);
return ret_value;
}
printf("Extracting Files ... ... ... ...\n");
printf("--Last Modify Time-------File Size---------File Name--\n");
fread(&ch, 1, 1, destFile);
chi = fgetc(destFile);
if (chi == EOF)
{
printf("No files in the destFile\n");
free(rw_buf);/*rex 2002-11-22 11:47*/
fclose(destFile);
return ret_value;
}
for (i=2; i<Num_Files-1; i++)
{ imgFileName = FileName[i];
flag = Fd_Position(destFile, FileName[i]);
if (flag==1)
{ path[0]='\0';
fread (&header.fname,1, MAXFILE+MAXEXT, destFile);
header.flength = Read_From_File(destFile);
header.srcflength = Read_From_File(destFile);
/* header.creatTime=Read_From_File(destFile);*/
header.modifyTime=Read_From_File(destFile);
strcpy (path,curdir);
strcat (path, header.fname);
tp=localtime(&header.modifyTime);
strftime(buf, sizeof(buf), "%Y-%m-%d %H:%M:%S",tp);
printf ("%s %10ld %16s\n",buf,header.flength,header.fname);
pImgfile=fopen (path,"wb");
for (loop=0;loop< header.flength/RW_BYTES;loop++)
{ fread(rw_buf,1,RW_BYTES,destFile);
fwrite(rw_buf, 1, RW_BYTES, pImgfile);
}
if (header.flength%RW_BYTES!=0)
{ fread(rw_buf,1,header.flength%RW_BYTES,destFile);
fwrite(rw_buf, 1, header.flength%RW_BYTES, pImgfile);
}
fclose ( pImgfile);
times.modtime = times.actime = header.modifyTime;
utime(path,×);
ret_value=1;
}
else
printf("Warning: File %s was not found!\n", imgFileName);
}/*end of for (i=2; i<Num_Files-1; i++)*/
free(rw_buf);
fclose(destFile);
return ret_value;
}
#ifdef VxWorks
#if 0
/*
wangjian change 2005-7-19 18:22, IP00030078
原有的方式下,z_seek的效率太低,用新的函数替代
*/
/* 以前调用:fp = fdopen(fd,"rb"),当fclose(fp)之后同时释放fd,引起错误。
因此使用参数*zarName,使用fopen()打开文件操作 */
int z_seek(int fd, char *zarName, char *imgFileName)
{
HdZAR header; /*合并后各IMG文件的文件头。*/
FILE *fp;
struct stat file_stat;
char ch;
int nCnt;
fstat(fd,&file_stat);
fp = fopen(zarName, "rb");
if( file_stat.st_size <= 1)
{
fclose(fp);
return ERROR;
}
else
fread(&ch, 1,1,fp);
while (TRUE)
{
if( fread ((char*)&header.fname,1, MAXFILE+MAXEXT,fp) != (MAXFILE+MAXEXT))
break;
header.flength = Read_From_File(fp);
header.srcflength = Read_From_File(fp);
/* header.creatTime=Read_From_File(fp);*/
header.modifyTime=Read_From_File(fp);
if (stricmp(header.fname, imgFileName)==0)
{
lseek(fd,ftell(fp),SEEK_SET);
fclose(fp);
return header.flength;
}
else
{
if( (ftell(fp)+header.flength) >= file_stat.st_size)
break;
else
{
for(nCnt=0;nCnt<header.flength;nCnt++)
fread(&ch, 1,1,fp);
/* lseek(fd, header.flength, SEEK_CUR);*/
}
}
}
/* while (TRUE)
{
if( fread ((char*)&header,1, sizeof( HdZAR),fp) != sizeof( HdZAR))
break;
if (stricmp(header.fname, imgFileName)==0)
{
lseek(fd,ftell(fp),SEEK_SET);
return header.flength;
}
else
{
if( (ftell(fp)+header.flength) >= file_stat.st_size)
break;
else
{
for(nCnt=0;nCnt<header.flength;nCnt++)
fread(&ch, 1,1,fp);
}
}
}*/
fclose(fp);
return ERROR;
}
#endif
#if 1
/*
wangjian add 2005-7-19 18:23,IP00030078,
别工优化了这个函数的实现方法,可以大大提高z_seek的速度
*/
long read_file(int fd)
{
unsigned char ch;
long i;
read(fd, &ch, 1);
i = ch << 24;
read(fd, &ch, 1);
i |= ch << 16;
read(fd, &ch, 1);
i |= ch << 8;
read(fd, &ch, 1);
i |= ch;
return i;
}
int z_seek(int fd, char *zarName, char *imgFileName)
{
HdZAR header; /*合并后各IMG文件的文件头。*/
lseek(fd, 1, SEEK_SET); /* skip 1 byte */
while (TRUE) {
if (read(fd, (char *)&header.fname, MAXFILE+MAXEXT) != MAXFILE+MAXEXT)
{
printf("z_seek:read error %i, fd=%i\n",errno, fd);
break;
}
header.flength = read_file(fd);
header.srcflength = read_file(fd);
header.modifyTime = read_file(fd);
if (stricmp(header.fname, imgFileName)==0)
return header.flength;
else
lseek(fd, header.flength, SEEK_CUR);
}
return ERROR;
}
#endif
int mem_seek(char* zar_mem,UINT zar_mem_size,char *imgFileName,char** pp_img_mem)
{
HdZAR* p_zar_head; /*合并后各IMG文件的文件头。*/
long FileSize = 0;
union {
char b[4];
long l;
} Temp_u;
if( zar_mem_size < sizeof(HdZAR) + 1 )
return ERROR;
else
p_zar_head = (HdZAR*)((char*)zar_mem + 1);
while (TRUE)
{
Temp_u.l = p_zar_head->flength;
FileSize = (long)((Temp_u.b[0]<<24)&0xff000000);
FileSize|= (long)((Temp_u.b[1]<<16)&0xff0000);
FileSize|= (long)((Temp_u.b[2]<<8)&0xff00);
FileSize|= (long)((Temp_u.b[3])&0xff);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -