二进制双通道技术实现文件分割(二)

原创 2004年09月10日 17:04:00
(2)添加一个模块Module1,其中包含各种算法具体实现过程,双击模块写入以下代码:?


  Type?FileSection?


  Bytes()?As?Byte?


  End?Type?’定义实际内存数组?


  Type?SectionedFile?


  Files()?As?FileSection?


  End?Type?’定义辅助内存数组,以备扩展使用?


  Type?FileInfo?


  OrigProjSize?As?Long?’文件大小?


  OrigFileName?As?String?


  FileCount?As?Integer?


  FileStartNum?As?Long?


  End?Type?’定义还原信息文件结构参数?


  Public?Function?SplitFile(SplitFileName?As?String,BeginningNumber?As?Long,ReturnErrorDes?As?String,Split?As?Long,oName?As?String)?As?Boolean?


  ’定义公有过程,用来分割文件,函数返回一逻辑值。true代表成功,false代表失败,四个参数依次是,被分割文件名,开始编号,分割后文件大小,分割后文件名称?


  Dim?SaveName?As?String?’分割后文件名?


  Dim?fnum?As?Integer,fnum1?As?Integer?’文件通道变量?


  SplitFile=True?’如果下面没有错误,返回真值?


  On?Error?GoTo?CleanUp?


  Dim?CurrentFile?As?SectionedFile,m_lngNumFil?As?Long,m_LngLoop?As?Long,FilesLen?As?Long?


  FilesLen=FileLen(SplitFileName)?’得到被分割文件大小?


  If?FilesLen?<=?Split?+?1?Then?


  SplitFile=False?


  ReturnErrorDes="被分割文件大小小于分割后文件大小,请重新设置!"?


  Exit?Function?


  End?If?’如果被分割文件小于分割后文件,退出过程?


  fnum=FreeFile?’返回第一个空闲通道用来读取?


  Open?SplitFileName?For?Binary?As?fnum?’用二进制方式打开被分割文件?


  If?CInt(FilesLen/Split)>=FilesLen/Split?Or?CInt(FilesLen/Split)=FilesLen/Split?Then?


  m_lngNumFil=CInt(FilesLen/Split)?


  Else?


  m_lngNumFil=CInt(FilesLen/Split)+1?


  End?If?’精确计算文件将被分割的个数?


  ReDim?CurrentFile.Files(1)?’分配一个内存辅助数组?


  For?m_LngLoop=1?To?m_lngNumFil?


  ?’这个循环用来将文件分割,并且生成分割后的文件?


  If?m_LngLoop?<?m_lngNumFil?Then?’如果不是最后一次循环?


  ReDim?CurrentFile.Files(1).Bytes(1?To?Split)?


  ’?重新分配大小等于分割尺寸的内存数组?


  Get?#fnum,,CurrentFile.Files(1).Bytes?


  ’读取等于分割大小的二进制数据到内存数组?


  Else?’如果是最后一次循环?


  ReDim?CurrentFile.Files(1).Bytes?To?FilesLen-((m_lngNumFil-1)*Split))?


  ’重新分配大小等于遗留长度的内存数组?


  Get?#fnum,,CurrentFile.Files(1).Bytes?


  Close?#fnum?’关闭读取文件通道?


  End?If?


  SaveName=oName?&?"."?&?Format(BeginningNumber-1+m_LngLoop,"00#")?’计算分割后的文件名,扩展名为00??


  fnum1=FreeFile?’得到第二个空闲通道用来写入?


  Open?SaveName?For?Binary?As?fnum1?


  Put?#fnum1,1,CurrentFile.Files(1)?


  DoEvents?


  Close?#fnum1?’用二进制方式写入分割后的文件?


  Form1.Command6.Caption=FormatPercent(m_LngLoop?/?m_lngNumFil)?’显示简单的进度指示?


  Form1.Command5.Caption=SaveName?’显示正在操作的文件名?


  Next?


  Dim?FileInfoFile?As?FileInfo?’定义还原信息文件内容?


  FileInfoFile.FileCount=m_lngNumFil?’分割后文件个数?


  FileInfoFile.OrigFileName=oName?’输出文件名?


  FileInfoFile.OrigProjSize=FileLen(SplitFileName)?’被分割文件大小?


  FileInfoFile.FileStartNum=BeginningNumber?’分割后文件起始编号?


  SaveName=oName?&?".HJ"?’还原信息文件名?


  fnum=FreeFile?


  Open?SaveName?For?Binary?As?#fnum?


  Put?#fnum,,FileInfoFile?


  Close?#fnum?’写入还原信息文件?


  Exit?Function?


  CleanUp:?’如果出现错误?


  ReturnErrorDes=Err.Description?


  SplitFile=False?’返回值为false?


  End?Function?


  PublicFunctionReassembleFile(Template?FileName?As?String,Optional?UseOldFilenameAsBoolean=True,OutPutName?as?string)As?Boolean?’定义文件还原操作公用过程?


  On?Error?GoTo?e?


  Form1.MousePointer=11?


  Dim?FileInfo?As?FileInfo,outname?As?String,File?As?SectionedFile,m_LngLoop?As?Long,OpenName?


  Dim?fnum?As?Integer,fnum1?As?Integer?


  ReassembleFile=True?


  fnum=FreeFile?


  Open?TemplateFileName?For?Binary?As?#fnum?


  Get?#fnum,,FileInfo?


  Close?#fnum?’读取还原信息文件的有关内容?


  If?UseOldFilename?Then?


  outname=FileInfo.OrigFileName?


  Else?


  outname=OutPutName?


  End?If?’是否自己指定还原后文件名?


  ReDim?File.Files(1)?


  fnum1=FreeFile?


  Open?outname?For?Binary?As?#fnum1?


  For?m_LngLoop=1?To?FileInfo.FileCount?


  ’通过还原信息中记载的文件个数确定读取次数?


  OpenName=FileInfo.OrigFileName?&?"."?&?Format((FileInfo.FileStartNum-1+m_LngLoop),"00#")?


  ’得到分割后生成的文件名称、路径?


  fnum=FreeFile?


  Open?OpenName?For?Binary?As?#fnum?


  Get?#fnum,1,File.Files(1)?


  Close?#fnum?’读取?


  Put?#fnum1,,File.Files(1).Bytes?’写入?


  Form1.Command6.Caption=FormatPercent(m_LngLoop/FileInfo.FileCount)?


  Form1.Command5.Caption=OpenName?


  Next?


  Close?#fnum1?


  Form1.MousePointer=0?


  Exit?Function?


  e:?


  MsgBox?"文件操作产生了错误:"?&?Err.Description,vbExclamation?


  ReassembleFile=False?


  Form1.MousePointer=0?


  End?Function?


  (三)运行调试:?


  首先通过浏览指定被分割文件名、分割后文件大小、分割后文件名或者还原信息文件名、还原后文件名,然后点击开始分割或者开始还原即可,该程序算法严谨,但是,为了保留一定的扩展能力和对以往源代码的兼容性,也存在一些冗余代码,读者尽可以根据自己的喜好进行改进。另外,使用vb5的朋友注意了,本文函数FormatPercent函数只能在vb6中使用,它的作用是将一个表达式转化成百分数,你必须采用其他的变通方法,其他代码全部通用。?

Linux下二进制文件的分割与合并

博客分类: Linux/Unix日常管理   dd的作用是转换和拷贝文件,我们可以利用它来分割文件,相关的选项如下: if=filename:输入的文件名 of=finename:输出的...
  • zangcf
  • zangcf
  • 2013年03月19日 13:59
  • 2505

图像阈值分割(二值化)

图像分割是模式识别和计算机视觉中很重要的
  • wrightman
  • wrightman
  • 2014年09月11日 11:25
  • 4605

图像处理之基于Otsu阈值二值化

基于Otsu阈值方法实现图像二值化
  • jia20003
  • jia20003
  • 2015年02月23日 12:33
  • 10928

加一条内存条组成双通道(实战)

先列一下自己的电脑配置+购买的 京东条内存条:自己不需要很高,按自己需求来。我收到的条条实物图:都准备好了就开始了:首先:1:2:用螺丝刀开始卸螺丝:建议自己把螺丝放进一个容器:要是丢了。。。看一下u...
  • qq_26816591
  • qq_26816591
  • 2016年06月26日 07:32
  • 278

sed替换二进制

sed是流编辑器,流既可以是字符流也可以是二进制流,可以针对文本字符或二进制字符进行修改替换,可以直接修改二进制文件。感谢multiple1902提醒。 $ sed 's/\x0D\x4D\x5...
  • epeaktop
  • epeaktop
  • 2015年10月09日 11:53
  • 1257

使用Python进行文件的分割与合并

使用Python来进行文件的分割与合并是非常简单的。 python代码如下: splitFile--将文件分割成大小为chunksize的块; mergeFile--将众多文件块合并成原来的文件; #...
  • just_young
  • just_young
  • 2014年11月25日 19:25
  • 2097

C语言实现的二进制文件复制

//复制文件 void CopyFile(char* s1,char* s2) { FILE * file1,*file2; //使用二进制模式打开文件 file1 = fopen(s1,"...
  • zgljl2012
  • zgljl2012
  • 2015年02月10日 15:00
  • 2076

虹膜图像分割(二)外圆检测

在上 正常情况下,一副拍好的虹膜图像如下所示(当然有的可能不一样,大概相同):...
  • computerme
  • computerme
  • 2014年11月14日 18:46
  • 2099

关于c#文件流与二进制的读入写出(二)

一、使用StreamWriter类写入文件      应用FileStream类需要许多额外d
  • ytqxiaoma
  • ytqxiaoma
  • 2014年11月04日 17:47
  • 521

十三种基于直方图的图像全局二值化算法原理、实现、代码及效果

图像二值化的目的是最大限度的将图象中感兴趣的部分保留下来,在很多情况下,也是进行图像分析、特征提取与模式识别之前的必要的图像预处理过程。这个看似简单的问题,在过去的四十年里受到国内外学者的广泛关注,产...
  • novocane
  • novocane
  • 2014年10月15日 23:53
  • 3012
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:二进制双通道技术实现文件分割(二)
举报原因:
原因补充:

(最多只允许输入30个字)