189上位机VC MFC实现指定文件的分割与合并
189上位机VC MFC实现指定文件的分割与合并 功能展示 压缩软件都有将文件按指定大小分割成众多小块的功能,方便存储,我们当前例程也实现指定文件的分割功能,选择要分割的文件,指定每分割文件的大小,就可进行分割合并操作,效果如图; 要点提示 文件的相关操作都可以通过类Cfile实现,例程也通过Cfile类的Read(),Write()实现文件的读取与写入功能; 指定的文件分隔后会通过INI文件保存文件名,文件分割数,文件后缀等信息,在文件合并时些信息进行操作; 实现功能 1.新建基于对话框的应用程序 2.添加四变量private: CStringm_sFilePathName,m_sFileTitle,m_sFileExt,m_sINIPathName; 拖拽一编辑框ID为IDC_EDIT1,及一按钮《选择要分隔的文件》用于实现要分隔文件的指定与显示 ;拖拽一编辑框IDC_EDIT2用于设置分割块的大小;最后分别实现 <执行分割文件><执行合并文件>按钮功能; - void CGkbc8Dlg::OnSeparate()
- {
- CFile *readfile,*writefile;
- DWORD filelen,readlen,poslen;
-
- CString sFilePath,sSize,sSepFilePath;
- sFilePath = m_sFilePathName.Left(m_sFilePathName.ReverseFind('\\'));//获得将要分割的文件的全路径
- GetDlgItemText(IDC_EDIT2,sSize);//获得文件分割块的大小
- if(sSize.IsEmpty()||sFilePath.IsEmpty())
- return;
- //><
- DWORD partsize=atoi(sSize)*1024;
- BYTE *b=new BYTE[partsize];
- readfile=new CFile(m_sFilePathName,CFile::modeRead);
- filelen=readfile->GetLength();
- int i=1;
- while(1)//在循环中根据文件的大小和用户设定的大小创建若干文件,并向文件中写入数据
- {
- ZeroMemory(b,partsize);
- sSepFilePath.Format("%s\\%spart%d_%s.dat",sFilePath,m_sFileTitle,i,m_sFileExt);
- //创建文件块
- HANDLE hfile=::CreateFile(sSepFilePath,GENERIC_WRITE|GENERIC_WRITE,0,0,CREATE_NEW,FILE_ATTRIBUTE_NORMAL,0);
- CloseHandle(hfile);
复制代码- writefile=new CFile(sSepFilePath,CFile::modeWrite);
- readlen=readfile->Read(b,partsize);
- poslen=readfile->GetPosition();//获取读取文件当前位置
- writefile->Write(b,readlen);
- writefile->Close();
- delete writefile;
- if(poslen==filelen)break;//已读到文件尾部
- i++;
- }
- readfile->Close();
- delete b;
- delete readfile;
-
- CString Segments,size;
- m_sINIPathName.Format("%s\\%s.ini",sFilePath,m_sFileTitle);//设置INI文件的路径
- size.Format("%d",filelen);
- Segments.Format("%d",i);
- //将原来文件的信息及分割后的文件数写入到INI文件中
- ::WritePrivateProfileString("FilePartition","FileTitle",m_sFileTitle,m_sINIPathName);
- ::WritePrivateProfileString("FilePartition","FileExt",m_sFileExt,m_sINIPathName);
- ::WritePrivateProfileString("FilePartition","Segments",Segments,m_sINIPathName);
- ::WritePrivateProfileString("FilePartition","FileSize",size,m_sINIPathName);
- }
- void CGkbc8Dlg::OnChoose()
- {
- CFileDialog Dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,NULL);
- if(IDOK == Dlg.DoModal())//点击确认后
- {
- m_sFilePathName=Dlg.GetPathName();
- m_sFileTitle=Dlg.GetFileTitle();
- m_sFileExt = Dlg.GetFileExt();
- SetDlgItemText(IDC_EDIT1,m_sFilePathName);
- }
- }
复制代码我们来演示下功能实现的整个过程
|