我是用两个 FileInfo 对象来存储源文件和目标文件,其实目标文件使用源文件的 .FullName 属性添加了一个 “.xbt” 的后缀,意图是压缩后避免忘记源文件的扩展名,例如压缩 “123.docx”,得到 “123.docx.xbt”。然后把它们传递给压缩文件过程:
Dim 缓冲区 As Byte()
Try
Using 源文件流 As New FileStream(源文件.FullName, FileMode.Open, FileAccess.Read, FileShare.Read)
缓冲区 = New Byte(CInt(源文件流.Length - 1)) {}
Dim 检查计数器 As Integer = 源文件流.Read(缓冲区, 0, 缓冲区.Length)
Using 目标文件流 As New FileStream(目标文件.FullName, FileMode.OpenOrCreate, FileAccess.Write)
Using 压缩流 As New GZipStream(目标文件流, CompressionMode.Compress, True)
压缩流.Write(缓冲区, 0, 缓冲区.Length)
压缩率 = CDbl(压缩流.Length / 源文件流.Length)
End Using
End Using
End Using
Return True
Catch ex As ApplicationException
MessageBox.Show(ex.Message, "压缩文件过程中发生致命错误!", MessageBoxButtons.OK, MessageBoxIcon.Error)
Return False
End Try
以上过程没有问题,目标文件也出现了并被压缩了,体积小了。后来我想实现列出目标文件的名称,并通过目标文件.Length/源文件.Length 来计算压缩率,但是回到主窗体那个按钮 CLick 过程时,却出现目标文件不存在错误,但源文件部分没事,同时查看资源管理器中目标文件已存在。而且压缩流 GZipStream.Lenth 属性不存在了,没法直接计算……