用户登录  |  用户注册
首 页商业源码原创产品编程论坛
当前位置:PB创新网文章中心编程技巧C++ Builder

文件合并与分隔

减小字体 增大字体 作者:佚名  来源:本站整理  发布时间:2009-03-16 20:42:41

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

先自己定义一个通用的文件表示,比如说下列格式:文件名长度(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,fmOpenReadfmShareDenyNone);
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);
  return false;
  }
int iFileSize=FileSeek(iSourceFileHandle,0,2); //得到文件长度
if(bProgress) //显示进度条
  {
  DlgProgress->Initialize(iFileSize,"恢复数据库从“"+SourceFile+"”到“"+DestPath+"”");
  DlgProgress->Show();
  }
FileSeek(iSourceFileHandle,0,0); //回到文件头
Buffer=new char[1024];
__try
  {
  while(FileSeek(iSourceFileHandle,0,1)<iFileSize)//是否时文件尾
    {
    if(bProgress&&g_bProcessEndByUser) //用户通过进度条终止
    break;
    int iStepBy=0; //进度条推进的步长
    //读入文件名长度
    iBytesRead=FileRead(iSourceFileHandle,(char *)&iSize,sizeof(iSize));
    if(iBytesRead!=sizeof(iSize))
      {
      mErrorMsg("读入文件名长度时出错.");
      return false;
      }
    iStepBy+=iBytesRead;
    //读入文件名
    Buffer[iSize]=0; //写入文件名字符串结束符
    iBytesRead=FileRead(iSourceFileHandle,Buffer,iSize);
    if(iBytesRead!=iSize)
      {
      mErrorMsg("读入文件名时出错.");
      return false;
      }
    iStepBy+=iBytesRead;
    //读入文件长度
    iBytesRead=FileRead(iSourceFileHandle,(char *)&iSize,sizeof(iSize));
    if(iBytesRead!=sizeof(iSize))
      {
      mErrorMsg("读入文件名长度时出错.");
      return false;
      }
    iStepBy+=(iBytesRead+iSize);
    if(bProgress)
      DlgProgress->Step(iStepBy);
    DestFile=DestPath+AnsiString(Buffer);
    iDestFileHandle=FileCreate(DestFile);
    if(iDestFileHandle<0)
      {
      sprintf(sTemp,"无法创建文件%s.",DestFile.c_str());
      mErrorMsg(sTemp);
      return false;
      }
   //拷贝数据
    for(int i=0;i<iSize/1024;i++)
      {
      iBytesRead=FileRead(iSourceFileHandle,Buffer,1024);
      iBytesWrite=FileWrite(iDestFileHandle,Buffer,1024);
      if(iBytesRead!=1024iBytesWrite!=1024)
        {
        mErrorMsg("拷贝数据时出错.");
        return false;
        }
      }
    iSize=iSize%1024; //剩下的未读入数据
    if(iSize==0)
      {
      FileClose(iDestFileHandle);
      iDestFileHandle=-1;
      continue;
      }
    iBytesRead=FileRead(iSourceFileHandle,Buffer,iSize);
    iBytesWrite=FileWrite(iDestFileHandle,Buffer,iSize);
    if(iBytesRead!=iSizeiBytesWrite!=iSize)
      {
      mErrorMsg("拷贝数据时出错.");
      return false;
      }
    FileClose(iDestFileHandle);
    iDestFileHandle=-1;
    }
  }

__finally
{
  FileClose(iSourceFileHandle);
  if(iDestFileHandle>0)
    FileClose(iDestFileHandle);
  delete [] Buffer;
  if(bProgress&&DlgProgress->Visible)
  DlgProgress->Close();
  }
return true;

Tags:

作者:佚名

文章评论评论内容只代表网友观点,与本站立场无关!

   评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论

相关文章

PB创新网ourmis.com】Copyright © 2000-2009 . All Rights Reserved .
页面执行时间:1,843.75000 毫秒
Email:ourmis@126.com QQ:2322888 蜀ICP备05006790号