VB 实现大文件的分割与恢复,引用 ADODB.Stream 提供一个过程代码

    技术2022-05-11  117

    '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


    最新回复(0)