快速业务通道

文件合并与分隔

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-30

思想很简单,将原来的文件统一当作二进制文件依次读取,然后依次写入一个新的二进制文件中,这样就完成了合并操作;反向操作就可以分割文件了……

先自己定义一个通用的文件表示,比如说下列格式:文件名长度(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);
 

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号