压缩流

时间:2014-03-19 14:05:11

标签: vb.net gzip gz

我正在尝试压缩文件到流,这是通过wcf发送并解压缩的。但是,使用以下代码,在尝试执行解压缩的exe时,我得不到有效的exe。任何解压缩的exe都比原来的低了大约211-212个字节。

Sub Main()

    Dim strm As Stream = CompressToStream("c:\rje\Launcher.exe")

    DecompressToFile(strm)

End Sub

压缩例程

Private Function CompressToStream(ByVal strFullFilename As String) As Stream

    If File.Exists(strFullFilename) Then

        Dim uncompressedfile As New MemoryStream(File.ReadAllBytes(strFullFilename))

        Dim compressedStream As New MemoryStream
        Dim compressionStream As New GZipStream(compressedStream, CompressionMode.Compress)

        uncompressedfile.CopyToStream(compressionStream)
        compressionStream.Flush()
        compressedStream.Position = 0
        Return compressedStream

    End If

    Return Nothing
End Function

使用.net3.5

复制流的扩展方法
<System.Runtime.CompilerServices.Extension()> _
Private Sub CopyToStream(ByVal input As Stream, ByRef output As Stream)

    Dim Buffer(4096) As Byte
    Dim numRead As Integer = input.Read(Buffer, 0, Buffer.Length)
    Do While numRead <> 0
        output.Write(Buffer, 0, numRead)
        numRead = input.Read(Buffer, 0, Buffer.Length)
    Loop
End Sub

最后解压缩

Private Sub DecompressToFile(ByVal strmDownload As Stream)

    Dim spath As String = "c:\rje\text.exe"

    Using outFile As FileStream = File.Create(spath)
        Using Decompress As GZipStream = New GZipStream(strmDownload, CompressionMode.Decompress)
            ' Copy the compressed file into the decompression stream. 

            Dim buffer(4096) As Byte
            Dim numRead As Integer = Decompress.Read(buffer, 0, buffer.Length)
            Do While numRead <> 0
                outFile.Write(buffer, 0, numRead)
                numRead = Decompress.Read(buffer, 0, buffer.Length)
            Loop
        End Using
        outFile.Close()
    End Using
End Sub

如果有人能指出我出错的地方会很棒。

2 个答案:

答案 0 :(得分:2)

错误发生在CompressToStream上,正确修改如下函数

Private Function CompressToStream(ByVal strFullFilename As String) As Stream

    If File.Exists(strFullFilename) Then
        Dim compressedStream As New MemoryStream()
        Using uncompressedfile As New MemoryStream(File.ReadAllBytes(strFullFilename))
            Using compressionStream As New GZipStream(compressedStream, CompressionMode.Compress, True)
                uncompressedfile.CopyToStream(compressionStream)
            End Using
        End Using
        compressedStream.Seek(0, SeekOrigin.Begin)
        Return compressedStream 
    End If

    Return Nothing
End Function

我仍然没有答案为什么我不应该使用File.Exists()?

答案 1 :(得分:0)

以下是我在评论中发布的链接中的示例中的Compress()/ Decompress()方法:

Private Function Compress(ByVal strFullFilename As FileInfo) As Stream
    ' Get the stream of the source file. 
    Dim fi as New FileInfo(strFullFilename)
    Dim result As New MemoryStream() 
    Using inFile As FileStream = fi.OpenRead()
        ' Compressing: 
        ' Prevent compressing hidden and already compressed files. 

        If (File.GetAttributes(fi.FullName) And FileAttributes.Hidden) _
            <> FileAttributes.Hidden And fi.Extension <> ".gz" Then 
            ' Create the compressed file.
            Using Compress As GZipStream = New GZipStream(result, CompressionMode.Compress)
                ' Copy the source file into the compression stream. 
                Dim buffer As Byte() = New Byte(4096) {}
                Dim numRead As Integer = inFile.Read(buffer, 0, buffer.Length)
                Do While numRead <> 0
                    Compress.Write(buffer, 0, numRead)
                    numRead = inFile.Read(buffer, 0, buffer.Length)
                Loop

                'Console.WriteLine("Compressed {0} from {1} to {2} bytes.", fi.Name, fi.Length.ToString(), result.Length.ToString())

            End Using 
        End If 
    End Using 
    Return result
End Sub 

' Method to decompress. 
Private Sub Decompress(ByVal strmDownload As Stream, ByVal resultFileName As String)        

        ' Create the decompressed file. 
        Using outFile As FileStream = File.Create(resultFileName)
            Using Decomp As GZipStream = New GZipStream(strmDownload, CompressionMode.Decompress)
                ' Copy the compressed file into the decompression stream. 
                Dim buffer As Byte() = New Byte(4096) {}
                Dim numRead As Integer = Decompress.Read(buffer, 0, buffer.Length)

                Do While numRead <> 0
                    outFile.Write(buffer, 0, numRead)
                    numRead = Decomp.Read(buffer, 0, buffer.Length)
                Loop
                'Console.WriteLine("Decompressed: {0}", fi.Name)

            End Using 
        End Using 
    End Using 
End Sub