当前位置:七道奇文章资讯编程技术VC/C++编程
日期:2011-03-22 13:55:00  来源:本站整理

<b>文件归并与脱离</b>[VC/C++编程]

赞助商链接



  本文“<b>文件归并与脱离</b>[VC/C++编程]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:

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

先自己定义一个通用的文件表示,比方说下列格局:文件名长度(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);
  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!=1024||iBytesWrite!=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!=iSize||iBytesWrite!=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;
}


  以上是“<b>文件归并与脱离</b>[VC/C++编程]”的内容,如果你对以上该文章内容感兴趣,你可以看看七道奇为您推荐以下文章:
  • <b>hosts是什么 hosts文件在什么位置 若何改正hosts</b>
  • <b>在 Windows 8 中手动安装语言包</b>
  • <b>五个常见 PHP数据库问题</b>
  • Windows中Alt键的12个高效快速的利用本领介绍
  • <b>MySQL ORDER BY 的实现解析</b>
  • <b>详解MySQL存储历程参数有三种范例(in、out、inout)</b>
  • <b>Win8系统恢复出来经典的开始菜单的办法</b>
  • <b>Win8系统花屏怎么办 Win8系统花屏的办理办法</b>
  • <b>Windows 7系统下无线网卡安装</b>
  • <b>为什么 Linux不需求碎片整理</b>
  • <b>Windows 8中删除账户的几种办法(图)</b>
  • <b>教你如安在win7下配置路由器</b>
  • 本文地址: 与您的QQ/BBS好友分享!
    • 好的评价 如果您觉得此文章好,就请您
        0%(0)
    • 差的评价 如果您觉得此文章差,就请您
        0%(0)

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

       评论摘要(共 0 条,得分 0 分,平均 0 分) 查看完整评论
    Copyright © 2020-2022 www.xiamiku.com. All Rights Reserved .