当前位置: 首页 > 学习 > 电脑学习 > 程序设计 > VC > 实例分析类 > 正文

如何实现将一个文件分割成多个小文件

http://www.zk168.com.cn  招考学习网 2006-4-16 22:27:42
-----------------------------------------------------------[交流]-[打印]-[发送]-[收藏]--
  你也许会遇到到这样一个问题?当你有一个较大的软件,而无法用一张软盘将其全部拷下时,你也许会想到该将它分解开,分盘拷回去后,再将它们合并起来。现在的这种分割工具很多,你想自己动手做一个适合自己的分割工具么?下面就让我用以前用VC做的一个<袖珍文件分割器>的例程来告诉你吧!程序运行后界面如下:



图一
   基本构成思想:文件分割的基本思想比我之前发表的另一篇文章《如何将多个文件合并为一个可执行程序》的构成思想简单多了,它主要也分为分割文件和合并分割后的文件二大部分。分割文件,将原文件按指定分割大小进行等分,然后顺序读取其指定分割大小数据后到写到各自的新建文件中。合并文件,将各分割后的文件顺序读取后,写入到一个文件中既可。分割文件时,打开文件,读取指定的分割大小一段数据,写入到一新建文件中,接着再读同样大小的一段数据,再写入到一新建文件中……,直到读出文件最后一部分数据,写入到最后一个新建文件中。对每一个分割后的新建文件名,采用原文件名前加数字信息的方法,按分割的顺序,按个加上一数字标识信息,以便合并时使用。

分割文件的部分代码实现如下:

//文件分割涵数


int CFileSpltDlg::SplitMe()
{
......
//分割文件
do {
//动态建立一个新建文件名的前的数字
name = _ltoa(l, buff, 10);
name += _T("_");
CString newpath;

//判断选择目录未尾是否已有"\"符
if(m_targetpath.Right(1)=='\\')
newpath = m_targetpath;
else
newpath = m_targetpath + _T("\\");
if (!destFile.Open(newpath + name + m_SourceFile.GetFileName(),
CFile::modeWrite |
CFile::shareExclusive |
CFile::typeBinary |
CFile::modeCreate, &ex)) {
TCHAR szError[1024];
ex.GetErrorMessage(szError, 1024);
::AfxMessageBox(szError);
m_SourceFile.Close();
return 1;
}
do {
dwRead = m_SourceFile.Read(buffer, nCount);
destFile.Write(buffer, dwRead);
}//当文件小于指定要分割的大小时
while (dwRead > 0 && destFile.GetLength() < newlen);
destFile.Close();

l++;
UpdateWindow();
}while (dwRead > 0);
m_SourceFile.Close();
return 0;


合并文件时:和上面分割所采用的方法相反,将各个分割后的小文件读出后,按其分割后文件名前数字大小的顺序,按个写入到新建的文件中,这一新建文件的名字,为去掉分割后文件前面数字部分后的文件名(既原文件名)。

合并文件的部分代码实现如下:

// 文件合并函数


int CFileSpltDlg::MergeMe()
{
......
//开始合并文件
do {
//自动定位分割文件名前的数字信息
pref = _ltoa(l, buff, 10);
pref += _T("_");
//打开新的分割文件
if (!m_SourceFile.Open(newpath + pref + m_filename,
CFile::modeRead |
CFile::shareExclusive |
CFile::typeBinary, &ex)) {
TCHAR szError[1024];
ex.GetErrorMessage(szError, 1024);
destFile.Close();
m_path = _T("");
m_filename = _T("");
newpath = _T("");
UpdateData(FALSE);
return 0;
}
else
//形成一个新的文件名
name = _T(newpath + pref + m_filename);
do {//写入到目标文件中
dwRead = m_SourceFile.Read(buffer, nCount);
destFile.Write(buffer, dwRead);
}while (dwRead > 0);

m_SourceFile.Close();

l++;
UpdateWindow();
}while (l < 500);//little bit dirty solution, but you can always improve it!...

return 0;
}
-----------------------------------------------------------[交流]-[打印]-[发送]-[收藏]--
最新入库:
 
·实质、过程及意义——阿多尔诺“否定的辩证法”探微
·从Ontology的译名之争看哲学术语的翻译原则
·论马克思主义哲学经典的解释——解释学方法及其在马克
·中国哲学当前的核心与周边问题
·和合学与21世纪文化价值和科技
·中国文化的和合精神与21世纪
·宗教之间理当相互宽容
·上半个世纪的自由主义
·殷周至春秋时期神人关系之演进
·大学之道:构建以“三纲八目”为核心的道德修养体系
相关内容:
 
网友点评:
 
会员名称:
密码:匿名 ·注册·忘记密码?
评论内容:
(最多300个字符)
  查看评论
友情提醒:
 1.库中的资料大都来自互联网、网友上传、各类书籍,在录入的过程中难免会出现错误,恳请网
 友来信指正!
 2.如果网友在本库中未能找到所需要的材料,请登陆到我们的论坛《招考学习网》版块!
 3.考友想加入招考学习网的编辑部,请发信到XueXiWang#Gmail.com(#改为@)附带个人简历
 4.如需转载请注明出处及作者,谢谢合作!
 5.如果您有更好的建议或意见请EMAIL:XueXiWang#Gmail.com (#改为@)
 6.凡标题中有注有“[NO]”字样均不含答案且答案整理中.
 7.如本库中转载文章涉及版权等问题,请相关网站或作者在两周内发邮件通知(EMAIL:  XueXiWang#Gmail.com (#改为@))我们,我们接到通知后立即删除该文章及链接!
你问我答 更多>>