文件的合并与分割

来源:互联网 发布:spark和java的关系 编辑:程序博客网 时间:2024/05/16 19:07

文件的合并与分割其实比较简单,分割时将一个大文件按二进制方式读取,然后按二进制写成一个个小文件。
合并时就把小文件顺次读取,再写入一个大文件。

下面是一个简单的例子:

//文件分割, 二进制读取
void CMyupdateDlg::OnBinary() 
{
 UINT nNewSize = 500000; //分成每个文件为512k
 UINT nPerSize = nNewSize/10; //每次读取大小

 CFile filesrc;
 CFile filedst;
 filesrc.Open("c://sx//mfc.bmp", CFile::modeRead | CFile::shareDenyNone | CFile::typeBinary);
 
 DWORD dwSize = filesrc.GetLength();
 if(dwSize<=nNewSize)
 {
  AfxMessageBox("文件小于512K, 不用分割!");
 }
 
 BYTE buf[140000]; //缓冲区
 DWORD dwRead = 0;

 UINT nIndex = 1;
 do 
 {
  CString name;
  name.Format("C://sx//mfc%d", nIndex);
  filedst.Open(name, CFile::modeWrite | CFile::shareExclusive | CFile::typeBinary | CFile::modeCreate);
  do
  {
   dwRead = filesrc.Read(buf, nPerSize);
   filedst.Write(buf, dwRead);
  }
  while(dwRead>0 && filedst.GetLength()<nNewSize);
  filedst.Close();
  nIndex++;
 }
 while(dwRead>0);

 filesrc.Close();
 
}

//文件合并
void CMyupdateDlg::OnBinary2() 
{
 UINT nNewSize = 500000; //分成每个文件为512k
 UINT nPerSize = nNewSize/10; //每次读取大小

 CFile filesrc;
 CFile filedst;
 filedst.Open("c://sx//mfc2.bmp", CFile::modeWrite | CFile::shareExclusive | CFile::typeBinary | CFile::modeCreate);

 BYTE buf[140000]; //缓冲区
 DWORD dwRead = 0;
 int i;
 for(i=1;i<=4;i++)
 {
  CString name;
  name.Format("C://sx//mfc%d", i);
  filesrc.Open(name, CFile::modeRead | CFile::shareDenyNone | CFile::typeBinary);
  do
  {
   dwRead = filesrc.Read(buf, nPerSize);
   filedst.Write(buf, dwRead);
  }
  while(dwRead>0);
  filesrc.Close();
 }
 filedst.Close(); 
}

只是在读取时注意一个问题,因为分割的文件是固定大小的,只会有最一个文件才可能小于这个固定值。
为保证分割的各文件大小固定。在每次读取时,要为这个目标小文件大小的倍数,否则可能造成文件大小不为设定的值。
即UINT nPerSize = nNewSize/10; //每次读取大小

其中dwRead = filesrc.Read(buf, nPerSize);
dwRead为读取的文件大小,并不一定等于nPerSize, 因为最后一次读取可能dwRead<nPersize 当dwRead<0时,表示文件读取结束