学vc也几个星期了 总想写个小小的东西出来
但却担心自己懂的还太少
刚好带做项目老师给我出了个题目
就是写个能分割文件的小冬冬
并要我2个星期完成 于是便恨下心开始了
想不到不到一星期就完成了 哈哈 偷笑一下
其实是个非常非常简单东西
非常非常的没什么技术含量 .`.`.`.`
不过写完后也觉得成才了许多
看来以后要多写写
期间曾多次遇到难点而且csdn询问
在此谢谢在csdn为我解答各位仁兄 使我能顺利完成
现把代码一并贴出来 给向我一样的初学者参考参考
此代码没用异常检测 功能代码突出 刚好适合小菜阅读
高手们见笑了
/*=========================================================================================
名称:CutFile
作者:幻刃(Lsaint)
版本:1.0
功能:★将目标目标文件切割为一系列指定大小的小文件
★将切割后的小文件重新组合为源文件
备注:此代码为突出可读性 为实现异常检测的功能
也未考虑源文件过大或切割后块数过多的问题 =========================================================================================*/
void CspDlg::OnBnClickedButton1() //切割文件
{
UpdateData();
CFile file1(sFile,CFile::modeReadWrite|CFile::shareDenyNone); // 打开源文件
CFile file2;
DWORD fileposition=file1.GetPosition();//文件读写位置
DWORD fileremaind=file1.GetLength(); //源文件大小
CString dFilename[21]; //文件名数组
CString num; //文件号码
sFile=file1.GetFilePath(); //源路径
void* buffer=malloc(pSize); // 设置 缓存区
for(int i=0;i<=20;i++)
{
num.Format(_T("%d"),i); // _T .. 2005默认用UNICODE编码....
dFilename[i]=sFile+num;
}
int n=fileremaind/pSize+1;
for(int j=0;j<n;j++)
{
file2.Open(dFilename[j],CFile::modeCreate|CFile::modeWrite|CFile::shareDenyNone,0);
file1.Seek(fileposition,CFile::begin);
if(fileremaind<pSize) //最后一块文件大小用取余获得
{pSize=fileremaind%pSize;}
file1.Read(buffer,pSize);//读
file2.Write(buffer,pSize);//写
fileposition=fileposition+pSize;
fileremaind=fileremaind-pSize;
file2.Close();
}
file1.Close();
// TODO: 在此添加控件通知处理程序代码
}
void CspDlg::OnBnClickedButton2()//选择要切割的文件
{
CFileDialog dlg(1,0,0,4|2,0,0,0);
if(dlg.DoModal()==IDOK)
{
sFile=dlg.GetPathName();
UpdateData(0);
}
}
void CspDlg::OnBnClickedButton3()// 选择输出文件夹
{
TCHAR pszBuffer[_MAX_PATH];
BROWSEINFO bi; LPITEMIDLIST pidl;
bi.hwndOwner = NULL;
bi.pidlRoot = NULL;
bi.pszDisplayName = pszBuffer;
bi.lpszTitle = _T("选择输出路径");
bi.ulFlags = BIF_RETURNFSANCESTORS | BIF_RETURNONLYFSDIRS;
bi.lpfn = NULL;
bi.lParam = 0;
if((pidl = SHBrowseForFolder(&bi)) != NULL)
{
if(SHGetPathFromIDList(pidl, pszBuffer))
{
CString strTemp(pszBuffer); dFile = strTemp;
if (dFile.GetLength() <= 1)
{
}
else if (dFile.Right(1) != _T("//"))
dFile += _T("//");
}
}
UpdateData(0); //显示
}
void CspDlg::OnBnClickedButton4() //合并
{
UpdateData();
CFile file1;
CFile file2;//(零)
file1.Open(sFile.Left(sFile.GetLength()-1),CFile::modeReadWrite|CFile::modeCreate);
//创建分割前的文件(整)
CString num;
CString name;
for(int i=0;i<20;i++)
{
num.Format(_T("%d"),i); //后缀数字
name=sFile.Left(sFile.GetLength()-1)+num; //顺序读取文件名
if(file2.Open(name,CFile::modeRead) ) //存在则打开分割后文件
{
void* buffer=malloc(file2.GetLength());//分配缓存
file2.Read(buffer,file2.GetLength()); //读取数据
file1.Write(buffer,file2.GetLength()); //写入数据
file2.Close();
}// End if//
}// End for//
file1.Close(); // 关闭文件
}//End Lsaint