首页 » 电脑技术 » 文章: VB编打造文件分割与合并软件
« 跑跑卡丁车普通道具资料集!GOOGLE搜索秘籍 »

VB编打造文件分割与合并软件

因为我自己的电脑没有连网,所以一直是需要什么资料或软件的时候就拿着一个mp3到网吧去下载,然后再转移到我自己的电脑中。这样不仅麻烦,而且遇到比较大的文件,我的128M的Mp3空间就不够用了。上次为了将visual studio包下载回来,还借了别人一个256M的mp3,把她里面所有歌曲删除光了才搞定。后来弄完了拿着一首歌曲都没有了的Mp3去还给人家,心里真是不好意思得很。于是,我就想在网上找一个可以分割文件的软件,将较大的文件分割成几份,然后分几次用Mp3转移到自己电脑中,再将其合并就好了。偏偏,我到处找遍,工具倒是找到不少,可是试用了后却发现,都不理想。要么是只能分割音乐文件,要么就是速度太慢,出现程序假死的情况,更有甚者合并后的文件根本就不能用。失望之余,我不再把希望寄托于他人,嘿,毛主席不是说过,自己动手,丰衣足食么。真是伟大,干脆咱就自己想办法根据需要写个属于自己的软件岂不是更爽?
说干就干。首先,我们要编写的是一个通用文件分割与合并软件,那么就需要对任意格式文件均能分割与合并,不仅限于音乐文件,特别是经常用来传输文件的压缩包在程序中一定要支持,否则软件的实用性就大打折扣。程序的关键部分在于如何正确拆分文件和合并文件上,这就涉及到文件的读取与写入问题,在我写的这个程序中,拆分文件和合并文件的思路是:用二进制模式来读写文件;拆分文件的时候,先将待分割文件以二进制模式读入到一个定义好的数组中,再按分割段数依次将对应数据写入到各分割文件;而合并文件则是按分割段数依次读取各分割文件,再写入到合并文件。因为是以二进制的方式读写文件,所以软件能实现对任意文件进行分割与合并。(在系统最底层,任何文件都是一系列的字节值,可以用二进制模式打开任何文件直接进行读写操作。)
另外,既然编写这个软件,就是为了经常用于分割较大的文件,但是,如果待分割文件太大的话,程序可能会出现挂起的情况,而且分割的速度会比较慢,我开始写这个程序的时候就遇到这种情况,测试一个5M多的压缩包,不但程序被挂起,而且分割完共花了半个多小时。想想,如果是这个样子的话,程序的编写还有什么意义?所以,在程序中,我们要定义相应的数组用于暂时存放待读写的二进制数据。千万不要一个字节一个字节的进行读写。好了,开始这软件的编写,因为我的C语言掌握得烂,只能够应付下学校里面的考试和二级测验罢了,别的编程语言又不会,所以就选择用VB进行这个软件的开发。
1、 启动VB6企业版,新建一个标准EXE工程,然后进行相应控件的布置。以下表格是程序中重要控件的相关属性设置:
name 备注
textbox txtFilePath 显示待分割文件全路径
textbox txtByte 供用户输入每段分割文件的大小(以字节为单位)
textbox txtJoin 显示要合并的第一个文件
textbox txtNum 供用户输入分割文件的个数,以便程序快速正确合并文件
commondbutton cmdPath 点击后出现打开对话框
commondbutton cmdNum 点击后计算按txtByte.Text文件将会分割成几份
commondbutton cmdSplit 开始分割(主要代码部分)
commondbutton cmdPath2 点击后出现打开对话框
commondbutton cmdJoin 合并文件(程序关键部分)
commondialog cdl 供用户选择待分割或合并文件
2、 编写代码:(以下是代码部分,是按照VB中字母顺序排列的,可以不按这个顺序查看代码,如先看拆分文件部分,再看合并文件部分,这样容易理解些。)
Private Sub cmdJoin_Click() ‘合并文件部分代码
Dim joinpath As String ‘声明变量
Dim filecontent() As Byte ‘用于存放读取的文件内容
Dim filesize As Long ‘文件大小
Dim lastPos As Long
Dim fnum1 As Integer ‘定义自由文件号
Dim fnum2 As Integer
joinpath = Trim(txtJoin.Text)
filesize = FileLen(joinpath) ‘获得文件大小
lastPos = (Trim(txtNum.Text) - 1) * filesize + 1
Path = Left(joinpath, Len(joinpath) - 1) ‘去掉分割文件路径末的“1”
path2 = Left(joinpath, Len(joinpath) - 2) ‘去掉分割文件路径末的“.1”,此变量即合并后文件的存放路径
Me.WindowState = 1 ‘合并大文件时可能程序会被挂起,此处开始合并时将其最小化,用户就不会发现
fnum2 = FreeFile() ‘获取自由文件号
Open path2 For Binary As fnum2 ‘以二进制模式打开要写入的文件
For i = 1 To Trim(txtNum.Text) - 1 Step 1 ‘按分割段数循环,因为在分割过程中可能最后一段大小比前面每一段小,所以最后一段要另外处理
fnum1 = FreeFile() ‘获取可用文件号
Open Path & i For Binary As fnum1 ‘按顺序依次打开分割的文件
ReDim filecontent(filesize - 1) ‘按每一段分割文件的大小重新定义文件内容变量数组
Get fnum1, , filecontent ‘读取文件内容并放入fileconten数组中
Close fnum1 ‘关闭文件
Put fnum2, , filecontent ‘将filecontent中存放的内容写入合并文件,因为不是一个字节一个字节的读取,所以程序速度会很快
Next i ‘退出循环
fnum1 = FreeFile()
Open Path & Trim(txtNum.Text) For Binary As fnum1 ‘打开最后一个分割文件
filesize = FileLen(Path & Trim(txtNum.Text)) ‘读取这个文件的大小
ReDim filecontent(filesize - 1) ‘重新定义存放文件内容数组
Get fnum1, , filecontent ‘读取最后一个分割文件内容存放在filecontent中
Close fnum1 ‘关闭文件
Put fnum2, , filecontent ‘将filecontent中内容写入合并文件,这里写入后,合并过程即完成
Close fnum2 ‘关闭文件,否则可能无法在程序外打开
MsgBox "合并文件成功!", vbInformation, "通用文件分割机(2005年末风速版)"
End Sub

 

Private Sub cmdNum_Click() ‘计算文件将会被分割成几段,并提示用户
Dim filesize As Long ‘获得待分割文件大小
Dim dNum As Long ‘声明分割段数变量
If Trim(txtByte.Text) <> "" And Trim(txtFilePath.Text) <> "" Then ‘如果用户未指定待分割文件和每段分割文件大小,则提示用户,防止程序出错
splitedpath = Trim(txtFilePath.Text) ‘获得待分割文件路径
filesize = FileLen(splitedpath) ‘计算待分割文件大小,以字节为单位
num = Trim(txtByte.Text) ‘每段分割文件大小,同样以字节为单位
If filesize Mod num = 0 Then ‘得到分割段数
dNum = filesize \ num
Else: dNum = filesize \ num + 1
End If
MsgBox "将按指定将文件拆分成" & dNum & "份!单击拆分按钮即可开始拆分或者重新设置!", vbInformation, "通用文件分割机(2005圣诞节版)"
Else: MsgBox "请指定待拆分文件和每个将生成的拆分文件大小,以字节为单位!", vbCritical, "通用文件分割机(2005年末版)"
End If
End Sub

Private Sub cmdPath_Click() ‘用户选择待分割文件
On Error Resume Next
cdl.ShowOpen ‘显示打开对话框,可以让用户选择任意文件

If cdl.FileName <> "" Then ‘如果用户选择了文件,程序往下进行
txtFilePath.Text = cdl.FileName
cdl.FileName = ""
End If
End Sub

Private Sub cmdPath2_Click() ‘用户选择待合并文件的第一个文件,即序号为1的文件
On Error Resume Next
cdl.ShowOpen
If cdl.FileName <> "" Then
txtJoin.Text = cdl.FileName
cdl.FileName = ""
End If
End Sub

Private Sub cmdSplit_Click() ‘关键过程:拆分文件过程
On Error Resume Next 出错依然进行,防止程序崩溃
If Trim(txtFilePath.Text) = "" Or Trim(txtByte.Text) = "" Then
MsgBox "请输入正确的待分割文件路径和每段分割字节数!", vbInformation, "通用文件分割机圣诞节版"
Exit Sub
End If
Me.WindowState = 1 ‘开始分割文件时,将窗口最小化
splitedpath = Trim(txtFilePath.Text) ‘获取待分割文件路径
Dim fnum1 As Integer ‘自由文件号
Dim fnum2 As Integer
Dim filecontent() As Byte ‘定义存放文件内容数组变量
Dim filesize As Long ‘文件大小
Dim i As Long
Dim dNum As Long ‘分割段数
filesize = FileLen(splitedpath) ‘获得待分割文件大小
num = Trim(txtByte.Text) ‘用户设定的每个分割文件的大小
If filesize Mod num = 0 Then ‘计算分割段数
dNum = filesize \ num
Else: dNum = filesize \ num + 1
End If
fnum1 = FreeFile()
Open splitedpath For Binary As fnum1 ‘以二进制模式打开待分割文件
For i = 1 To dNum - 1 Step 1 ‘按分割段数进行循环,最后一段另外处理
ReDim filecontent(num - 1)
Get fnum1, , filecontent ‘读取待分割文件,每次循环读取num个字节,这样程序运行速度比较快
fnum2 = FreeFile() ‘取得下一个可用文件号
Open splitedpath & "." & i For Binary As fnum2 依次创建文件,以便将读取的字节存入
Put fnum2, , filecontent ‘将filecontent内容写入分割文件
Close fnum2
Next i
ReDim filecontent(filesize - (dNum - 1) * num - 1) ‘按最后一段分割文件大小重新定义fileconten变量
Get fnum1, , filecontent ‘读取最后一段分割文件内容
Close fnum1 ‘全部读取完毕后关闭文件
fnum2 = FreeFile()
Open splitedpath & "." & dNum For Binary As fnum2 ‘以二进制模式打开最后一个分割文件
Put fnum2, , filecontent ‘写入最后一段分割文件内容
Close fnum2
MsgBox "拆分文件完成!共拆分成" & Str(dNum) & "份,存放在原文件同目录下!", vbInformation, "通用文件分割机2005岁末版"
End Sub

Private Sub Form_Resize()
If Me.WindowState <> 1 Then ‘如果窗体大小改变,而且不是因为最小化
If Me.Width <> 5085 Then ‘不允许改变窗体宽度
Me.Width = 5085
End If
If Me.Height <> 5205 Then ‘不允许改变窗体高度
Me.Height = 5205
End If
End If
End Sub

3、 说明:在本软件的编写过程中,提到以二进制模式读写文件,这里讲一下它的读写方法,get语句用于读文件,put语句用于写文件,使用方法是:
put【整型数:文件号】【可省略的长整型数:写入位置】【要写入文件的数据的变量名】
如果没有指定在何处写入,则从上一次写入或读取的地方开始。在我们软件的编写中,读取和写入文件的时候,打开文件后并没有将其关闭,而是全部读取完(拆分文件过程中)或全部写入完(合并文件过程中)再关闭文件,这样就可以省略第二个参数,程序每次读取或写入的时候均自动从上一次读取或写入的位置开始。
另外程序的运行机理是选择好待分割文件后,它会在程序内部计算出会分割成几段,如8段,前7段分割文件的大小肯定是一样的,最后一段则可能小一些。程序会将待分割文件分成8部分按照序号依次保存为8个分割文件。而合并的时候则需要用户选择第一个分割文件,即序号为1的分割文件,然后程序内部用二进制模式依次读取各个分割文件,将其内容再写入合并文件,最后即得到合并文件。这就是整个软件编写的思路与过程。我在XP+VB6企业英文版中测试通过,软件运行的速度很快,拆分一个54.5M的文件只需要十多秒,合并时间则更短。我也对EXE文件进行过测试,拆分后再合并成新的文件依然能够运行,只是图标改变了;压缩包的测试也成功了。

本文地址:http://www.sxyue.com/post/195/

发表评论

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

日历

最新评论及回复

最近发表

Search