分享
 
 
 

用VB6实现文件分割和还原

王朝厨房·作者佚名  2007-01-04
窄屏简体版  字體: |||超大  

虽然目前个人大容量存储设备(如CD、MO等)已经被广泛应用,但是由于光盘刻录机等设备价格居高不下,所以人们最常用的存储媒介还是软盘。使用软盘就存在容量有限的问题,对于较大的文件必须将文件进行分割(让文件分割成方便的大小),才能用软盘拷贝和携带。目前,有许多软件具有此项功能,但由于在文件还原时,要求执行还原的机器也必须安装同样的软件才能执行还原操作,考虑到软件的授权问题,实现起来非常不方便。笔者用VB 6中的二进制双通道技术实现了该功能,只要运行该程序,即可方便地实现文件的分割和还原。

编程原理和思路

文件分割实际上就是将目标文件用二进制读写的方法,精确地连续保存为合适大小的独立文件的过程。文件还原是文件分割的逆过程,即将分割后的文件严格地按照分割顺序用二进制读写的方法写入同一个文件的过程。

使用双通道技术是因为当被分割的文件较大或者非常大(远大于内存)时,利用单个文件通道定义的内存二进制缓冲数组非常容易造成内存的耗尽而导致操作失败,并且单个文件通道的处理速度和可靠性也不令人满意。

首先使用双通道技术将目标文件分割成指定大小的文件,扩展名为“指定文件名+.源文件扩展名+.分割序号”。分割时,生成一个还原信息文件“被分割文件名.HY”,该文件记录文件分割的有关信息。文件还原时,同样利用双通道技术,按照在还原信息文件中登记的信息,将待还原的文件写入同一个文件中即可。

编程实现

实现分割功能的主要代码如下:

1.分割操作

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 error1

Dim CurrentFile As SectionedFile, LngNumFile As Long, 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

LngNumFile = CInt(FilesLen / Split)

Else

LngNumFile = CInt(FilesLen / Split) + 1

End If

/*分配一个内存辅助数组*/

ReDim CurrentFile.Files(1)

/*循环将文件分割,并且生成分割后的文件*/

For LngLoop = 1 To LngNumFile

If LngLoop < LngNumFile Then

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

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

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

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

Else

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

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

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

Close #fnum

End If

/*计算分割后的文件名,扩展名为00?*/

SaveName = oName & “.” & Format(BeginningNumber - 1 + LngLoop, “000”)

/*得到第二个空闲通道用来写入*/

fnum1 = FreeFile

Open SaveName For Binary As fnum1

/*用二进制方式写入分割后的文件*/

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

DoEvents

Close #fnum1

Next

/*定义还原信息文件内容*/

Dim FileInfoFile As FileInfo

/*分割后文件个数*/

FileInfoFile.FileCount = LngNumFile

/*输出文件名*/

FileInfoFile.ProjectFileName = oName

/*被分割文件大小*/

FileInfoFile.ProjectSize = FileLen(SplitFileName)

/*分割后文件起始编号*/

FileInfoFile.FileStartNum = BeginningNumber

/*还原以HY为后缀的信息文件名*/

SaveName = oName & “.HY”

fnum = FreeFile

Open SaveName For Binary As #fnum

/*写入还原信息文件

Put #fnum, , FileInfoFile

*/

Close #fnum

Exit Function

error1:

ReturnErrorDes = Err.Description

SplitFile = False

End Function

2.文件还原

Public Function ReassembleFile(TemplateFileName As String, UseOldFilename As Boolean, OutPutName As String) As Boolean

On Error GoTo error2

Dim FileInfo As FileInfo, outname As String, File As SectionedFile, 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.ProjectFileName

Else

outname = OutPutName

End If

ReDim File.Files(1)

fnum1 = FreeFile

Open outname For Binary As #fnum1

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

For LngLoop = 1 To FileInfo.FileCount

/*得到分割后生成的文件名称和路径*/

OpenName = FileInfo.ProjectFileName & “.” & Format((FileInfo.FileStartNum - 1 + LngLoop), “000”)

fnum = FreeFile

Open OpenName For Binary As #fnum

Get #fnum, 1, File.Files(1) /*读取*/

Close #fnum

Put #fnum1, ,File.Files(1).Bytes /*写入*/

Next

Close #fnum1

Exit Function

error2:

MsgBox “文件操作产生错误:” & Err.Description, vbExclamation

ReassembleFile = False

Form1.MousePointer = 0

End Function

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
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- 王朝網路 版權所有