'VB 实现大文件的分割与恢复,引用 ADODB.Stream 提供一个过程:'要引用 Microsoft ActiveX Data Objects 2.5 Libary'或 Microsoft ActiveX Data Objects 2.6 LibaryPublic Sub StreamSplit(SourceFile As String, DestinationFile As String, ChunkSize As Long, Optional BufferSize As Long = 64# * 1024#, Optional ShowFinishMessage As Boolean)'ChunkSize 为 BufferSize 的倍数Dim adoStreamS As New ADODB.StreamadoStreamS.Type = adTypeBinaryadoStreamS.OpenadoStreamS.LoadFromFile SourceFileDim lFileSize As LonglFileSize = adoStreamS.SizeDim i As LongDim adoStreamT As New ADODB.StreamadoStreamT.Type = adTypeBinaryDo While lFileSize >= ChunkSize * BufferSize adoStreamT.Open adoStreamT.Write adoStreamS.Read(ChunkSize * BufferSize) adoStreamT.SaveToFile DestinationFile & "." & Format(i, "000"), IIf(Len(Trim(Dir(DestinationFile & "." & Format(i, "000")))) > 0, adSaveCreateOverWrite, adSaveCreateNotExist) adoStreamT.Close lFileSize = lFileSize - ChunkSize * BufferSize i = i + 1LoopIf lFileSize > 0 Then adoStreamT.Open adoStreamT.Write adoStreamS.Read(lFileSize) adoStreamT.SaveToFile DestinationFile & "." & Format(i, "000"), IIf(Len(Trim(Dir(DestinationFile & "." & Format(i, "000")))) > 0, adSaveCreateOverWrite, adSaveCreateNotExist)End IfIf ShowFinishMessage Then MsgBox "Finished!"End IfEnd Sub
Public Sub StreamRestore(SourceFile As String, DestinationFile As String, Chunks As Long, Optional BufferSize As Long = 64# * 1024#, Optional ShowFinishMessage As Boolean)Dim lFileSize As LongDim adoStreamT As New ADODB.StreamadoStreamT.Type = adTypeBinaryadoStreamT.OpenDim adoStreamS As New ADODB.StreamadoStreamS.Type = adTypeBinaryDim i As LongFor i = 0 To Chunks - 1 'Chunks 块数 adoStreamS.Open adoStreamS.LoadFromFile SourceFile & "." & Format(i, "000") adoStreamT.Write adoStreamS.Read adoStreamS.CloseNext iadoStreamT.SaveToFile DestinationFile, IIf(Len(Trim(Dir(DestinationFile))) > 0, adSaveCreateOverWrite, adSaveCreateNotExist)If ShowFinishMessage Then MsgBox "Finished!"End IfEnd Sub
'VB 实现大文件的分割与恢复,采用读写二进制数据的传统经典代码:Public Sub FileSplit(SourceFile As String, DestinationFile As String, ChunkSize As Long, Optional BufferSize As Long = 64# * 1024#, Optional ShowFinishMessage As Boolean)'ChunkSize 为 BufferSize 的倍数Dim FileBuffer() As ByteDim FileNumberS As LongDim FileNumberT As LongFileNumberS = FreeFileOpen SourceFile For Binary Access Read As #FileNumberSDim lFileLen As LonglFileLen = FileLen(SourceFile)FileNumberT = FreeFileDim i As LongDim j As LongReDim FileBuffer(1 To (BufferSize)) As ByteOpen DestinationFile & "." & Format(i, "000") For Binary Access Write As #FileNumberTDo While lFileLen >= BufferSize Get #FileNumberS, , FileBuffer If i = ChunkSize Then i = 0 j = j + 1 Close #FileNumberT FileNumberT = FreeFile Open DestinationFile & "." & Format(j, "000") For Binary Access Write As #FileNumberT End If i = i + 1 Put #FileNumberT, , FileBuffer lFileLen = lFileLen - BufferSizeLoopIf lFileLen > 0 Then ReDim FileBuffer(1 To lFileLen) As Byte Get #FileNumberS, , FileBuffer Put #FileNumberT, , FileBufferEnd IfClose #FileNumberTIf ShowFinishMessage Then MsgBox "Finished!"End IfEnd SubPublic Sub FileRestore(SourceFile As String, DestinationFile As String, Chunks As Long, Optional BufferSize As Long = 64# * 1024#, Optional ShowFinishMessage As Boolean)Dim FileBuffer() As ByteDim FileNumberS As LongDim FileNumberT As LongDim i As LongDim lFileLen As LongFileNumberT = FreeFileOpen DestinationFile For Binary Access Write As #FileNumberTFor i = 0 To Chunks - 1 FileNumberS = FreeFile Open SourceFile & "." & Format(i, "000") For Binary Access Read As #FileNumberS lFileLen = FileLen(SourceFile & "." & Format(i, "000")) ReDim FileBuffer(1 To BufferSize) As Byte Do While lFileLen >= BufferSize Get #FileNumberS, , FileBuffer Put #FileNumberT, , FileBuffer lFileLen = lFileLen - BufferSize Loop If lFileLen > 0 Then ReDim FileBuffer(1 To lFileLen) As Byte Get #FileNumberS, , FileBuffer Put #FileNumberT, , FileBuffer End If Close #FileNumberSNext iClose #FileNumberTIf ShowFinishMessage Then MsgBox "Finished!"End IfEnd Sub