程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> 文件合並與分隔

文件合並與分隔

編輯:關於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;
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved