📄 fmerge.c
字号:
}/*end of int Append_IMGfile(int Num_Files, char **FileName)*/
/*Delete the specified file(s) from the ZAR file
Input: The number of the arguments: Num_Files
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 = (UINT32)Read_From_File(destFile);
offset= header.flength;
offset_rec = (long)ftell(destFile)-(long)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 = (UINT32)Read_From_File(destFile);
fseek(destFile, (long)(0-(long)sizeof(HdZAR)-offset-(long)sizeof(HdZAR)), SEEK_CUR);
fwrite(header.fname, 1, MAXFILE+MAXEXT, destFile);
Put_To_File((UINT32)header.flength,destFile);
Put_To_File((UINT32)header.srcflength,destFile);
/* Put_To_File(header.creatTime,destFile);*/
Put_To_File(header.modifyTime,destFile);
offset_rec = offset_rec + (long)sizeof(HdZAR);
for (j=0;j< header.flength/RW_BYTES;j++)
{ fseek(destFile, (long)(offset+(long)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, (long)(offset+(long)sizeof(HdZAR)), SEEK_CUR);
fread(rw_buf,1,(UINT32)header.flength%RW_BYTES,destFile);
fseek(destFile, -(header.flength%RW_BYTES)-(long)sizeof(HdZAR)-offset, SEEK_CUR);
fwrite(rw_buf, 1, (UINT32)header.flength%RW_BYTES, destFile);
offset_rec=offset_rec+header.flength%RW_BYTES;
}
fseek(destFile, offset+(long)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+");
if(destFile==NULL)
{
free(rw_buf);
return ret_value;
}
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 = (UINT32)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,(UINT32)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 = (UINT32)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");
if(tmpImg==NULL)
{
free(rw_buf);
return ret_value;
}
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,(UINT32)header.flength%RW_BYTES,destFile);
fwrite(rw_buf, 1, (UINT32)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 = (UINT32)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");
if(pImgfile==NULL)
{
free(rw_buf);
return ret_value;
}
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,(UINT32)header.flength%RW_BYTES,destFile);
fwrite(rw_buf, 1, (UINT32)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
/* 以前调用: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(fp==NULL)
return ERROR;
if( file_stat.st_size <= 1)
{
fclose(fp);
return ERROR;
}
else
fread(&ch, 1,1,fp);
while (TRUE)
{
if( fread (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 = (UINT32)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) >= (int)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;
}
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);
/*zhou debug*/
if (stricmp(p_zar_head->fname, imgFileName)==0)
{
*pp_img_mem = (char*)p_zar_head + sizeof(HdZAR);
return FileSize;
}
else
{
p_zar_head =(HdZAR*)((char*)p_zar_head + sizeof(HdZAR) + FileSize);
if( (char*)p_zar_head > ( (char*)zar_mem + zar_mem_size))
break;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -