【发布时间】:2014-03-19 14:05:10
【问题描述】:
我正在尝试将通过 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
如果有人能指出我哪里出错了,那就太好了。
【问题讨论】:
-
永远不要像那样使用 File.Exists() (第二个代码 sn-p)。只需尝试打开文件,如果失败则处理异常。
-
什么版本的.Net?
-
@JoelCoehoorn 3.5 vs2008,为什么我不应该使用 File.Exists()?
-
好吧,你不能在 .Net 4.5 中使用新的 ZipArchive 了 :(
-
你看过这个示例代码吗? msdn.microsoft.com/en-us/library/… 我问只是因为我想知道以什么为起点。