分享
 
 
 

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

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

(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?

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?

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中使用,它的作用是将一个表达式转化成百分数,你必须采用其他的变通方法,其他代码全部通用。?

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有