編程原理和思路
文件分割實際上就是將目標文件用二進制讀寫的方法,精確地連續保存為合適大小的獨立文件的過程。文件還原是文件分割的逆過程,即將分割后的文件嚴格地按照分割順序用二進制讀寫的方法寫入同一個文件的過程。
使用雙通道技術是因為當被分割的文件較大或者非常大(遠大于內存)時,利用單個文件通道定義的內存二進制緩沖數組非常容易造成內存的耗盡而導致操作失敗,并且單個文件通道的處理速度和可靠性也不令人滿意。
首先使用雙通道技術將目標文件分割成指定大小的文件,擴展名為“指定文件名+.源文件擴展名+.分割序號”。分割時,生成一個還原信息文件“被分割文件名.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
延伸閱讀
文章來源于領測軟件測試網 http://www.kjueaiud.com/