用VB6實現文件分割和還原

發表于:2007-07-14來源:作者:點擊數: 標簽:
雖然目前個人大容量存儲設備(如CD、MO等)已經被廣泛應用,但是由于光盤刻錄機等設備價格居高不下,所以人們最常用的存儲媒介還是軟盤。使用軟盤就存在容量有限的問題,對于較大的文件必須將文件進行分割(讓文件分割成方便的大?。?,才能用軟盤拷貝和攜帶
雖然目前個人大容量存儲設備(如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

原文轉自:http://www.anti-gravitydesign.com

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97