文件的合并与分割其实比较简单,分割时将一个大文件按二进制方式读取,然后按二进制写成一个个小文件。
合并时就把小文件顺次读取,再写入一个大文件。
下面是一个简单的例子:
//文件分割, 二进制读取
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时,表示文件读取结束。