思想很简单,将原来的文件统一当作二进制文件依次读取,然后依次写入一个新的二进制文件中,这样就完成了合并操作;反向操作就可以分割文件了……
先自己定义一个通用的文件表示,比如说下列格式:文件名长度(4字节),文件名,文件长度(4字节),文件内容。然后新建一个文件,将你要加入的文件依次写进(当作二进制文件)。
至于还原吗,先读入合并后的文件,然后依次按以下过程还原文件:读入文件名长度,按此长度得到文件名,读入文件长度,按此长度得到文件的内容,写到磁盘上即可。具体的编程见以下例子:
//以下为文件合并与分解函数,合并文件后的文件中各子文件顺序存放,格式为: //文件名长度(int)、文件名、文件长度(int)、文件内容 //--------------------------------------------------------------------------- //将文件SoruceFile合并到文件DestFile中 bool MergeFile(AnsiString SourceFile,AnsiString DestFile) { int iSourceFileHandle,iDestFileHandle,iSize,iBytesRead,iBytesWrite; char sTemp[MAX_PATH]; iSourceFileHandle=FileOpen(SourceFile,fmOpenRead|fmShareDenyNone); if(iSourceFileHandle<0) { sprintf(sTemp,"无法打开文件%s.",SourceFile.c_str()); mErrorMsg(sTemp); return false; } if(FileExists(DestFile)) iDestFileHandle=FileOpen(DestFile,fmOpenWrite); else iDestFileHandle=FileCreate(DestFile); if(iDestFileHandle<0) { sprintf(sTemp,"无法打开文件%s.",DestFile.c_str()); mErrorMsg(sTemp); FileClose(iSourceFileHandle); return false; } FileSeek(iDestFileHandle,0,2); //指针移到文件尾 char *Buffer=new char[1024]; __try { AnsiString FileName=ExtractFileName(SourceFile); //不带路径的文件名 iSize=FileName.Length(); if(FileWrite(iDestFileHandle,(char *)&iSize,sizeof(iSize))!=sizeof(iSize)) { mErrorMsg("写文件名长度时出错."); return false; } if(FileWrite(iDestFileHandle,FileName.c_str(),iSize)!=iSize) { mErrorMsg("写文件名时出错."); return false; } iSize=FileSeek(iSourceFileHandle,0,2); //文件长度 if(FileWrite(iDestFileHandle,(char *)&iSize,sizeof(int))!=sizeof(iSize)) { mErrorMsg("写文件长度时出错."); return false; } FileSeek(iSourceFileHandle,0,0); //指针移到文件头 //拷贝文件 do { iBytesRead=FileRead(iSourceFileHandle,Buffer,1024); iBytesWrite=FileWrite(iDestFileHandle,Buffer,iBytesRead); if(iBytesWrite!=iBytesRead) { mErrorMsg("写入数据时出错."); return false; } }while(iBytesRead==1024); } __finally { FileClose(iSourceFileHandle); FileClose(iDestFileHandle); delete [] Buffer; } return true; } //--------------------------------------------------------------------------- //从合并所得的文件中分离出各个文件,bProgress决定是否显示进度条 bool SeperateFile(AnsiString SourceFile,AnsiString DestPath,bool bProgress) { int iSourceFileHandle=-1,iDestFileHandle=-1,iSize,iBytesRead,iBytesWrite; AnsiString DestFile; char *Buffer=NULL; char sTemp[MAX_PATH]; iSourceFileHandle=FileOpen(SourceFile,fmOpenRead); if(iSourceFileHandle<0) { sprintf(sTemp,"无法打开文件%s.",SourceFile.c_str()); mErrorMsg(sTemp);
|