当前位置: 首页 > news >正文

c语言文件分割与合并程序详解,如何实现将一个文件分割成多个小文件

你也许会遇到到这样一个问题?当你有一个较大的软件,而无法用一张软盘将其全部拷下时,你也许会想到该将它分解开,分盘拷回去后,再将它们合并起来。现在的这种分割工具很多,你想自己动手做一个适合自己的分割工具么?下面就让我用以前用VC做的一个<袖珍文件分割器>的例程来告诉你吧!程序运行后界面如下:

200512152323561820.jpg

图一

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

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

//文件分割涵数

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;

}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 使用dbms_rowid包获得rowid的详细信息
  • 高斯消元法的应用
  • 小波 c语言实现,小波分析算法的公式与C语言实现
  • 输入一行数字把5都看成空格 C语言,算法设计习题整理112.doc
  • 值得尊敬的---抵抗之都费卢杰
  • 风潇潇兮
  • 单片机c语言基本类型修饰符,下列属于 C语言中类型修饰符的是()。
  • 不知如何走的立交桥(西直门交警一文背景)
  • 趣味c语言题目,C语言趣味程序设计题目百例.doc
  • android线程池不工作了,Android线程篇(二):Java线程池
  • CSDN Oracle电子杂志创刊号发布
  • android应用程序开发(第二版)课后习题答案.doc,android移动应用开发习题答案.pdf
  • android item设置,listview怎样设置每个Item的高度?
  • realone 启动报错之解决方法
  • 360 os android m,360 OS让手机能玩三个系统 “搞机”者的福音
  • [PHP内核探索]PHP中的哈希表
  • [iOS]Core Data浅析一 -- 启用Core Data
  • [译] React v16.8: 含有Hooks的版本
  • Android系统模拟器绘制实现概述
  • echarts的各种常用效果展示
  • jquery ajax学习笔记
  • JS笔记四:作用域、变量(函数)提升
  • leetcode-27. Remove Element
  • orm2 中文文档 3.1 模型属性
  • Rancher如何对接Ceph-RBD块存储
  • React-flux杂记
  • vuex 学习笔记 01
  • 给初学者:JavaScript 中数组操作注意点
  • 解析 Webpack中import、require、按需加载的执行过程
  • 如何使用 OAuth 2.0 将 LinkedIn 集成入 iOS 应用
  • 深度学习在携程攻略社区的应用
  • 深度学习中的信息论知识详解
  • 云大使推广中的常见热门问题
  • 2017年360最后一道编程题
  • 回归生活:清理微信公众号
  • ​​​​​​​STM32通过SPI硬件读写W25Q64
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • #我与Java虚拟机的故事#连载10: 如何在阿里、腾讯、百度、及字节跳动等公司面试中脱颖而出...
  • (4) PIVOT 和 UPIVOT 的使用
  • (4)事件处理——(7)简单事件(Simple events)
  • (js)循环条件满足时终止循环
  • (ResultSet.TYPE_SCROLL_INSENSITIVE,ResultSet.CONCUR_READ_ONLY)讲解
  • (接上一篇)前端弄一个变量实现点击次数在前端页面实时更新
  • (四)Android布局类型(线性布局LinearLayout)
  • (算法)求1到1亿间的质数或素数
  • (已解决)Bootstrap精美弹出框模态框modal,实现js向modal传递数据
  • (转)ORM
  • (转)创业家杂志:UCWEB天使第一步
  • (转载)CentOS查看系统信息|CentOS查看命令
  • (转载)Linux 多线程条件变量同步
  • (最全解法)输入一个整数,输出该数二进制表示中1的个数。
  • .net mvc部分视图
  • .NET+WPF 桌面快速启动工具 GeekDesk
  • .Net高阶异常处理第二篇~~ dump进阶之MiniDumpWriter
  • .NET关于 跳过SSL中遇到的问题