以下是我用于压缩和解压缩目的的代码。我的目标是将数据表转换为XML然后转换为二进制压缩格式,然后将其读回并将二进制文件转换回XML。所以,基本上,我将XML转换为二进制压缩,然后将压缩二进制转换回XML。逻辑上,数据大小应该相同,但新解压缩的XML文件由于某种原因会丢失一个字节或更多。你能帮助我吗?
Imports System
Imports System.IO
Imports System.Runtime.Serialization
Imports System.Runtime.Serialization.Formatters.Binary
Imports System.IO.Compression
Imports System.Data.SqlClient
Imports System.Data.Sql
Public Class Form1
Dim dt As New SmExplorerDataDataSet.smedataDataTable
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim ta As New SmExplorerDataDataSetTableAdapters.smedataTableAdapter
ta.Fill(dt)
dt.WriteXml("abc.xml")
'Read the XML file and compress it
Dim in_fs As FileStream = New FileInfo("abc.xml").OpenRead
Dim out_fs As FileStream = File.Create("def.cmp")
in_fs.CopyTo(New DeflateStream(out_fs, CompressionMode.Compress))
in_fs.Close()
out_fs.Close()
'Read the compressed file and decompress it back into XML
in_fs = New FileStream("def.cmp", FileMode.Open, FileAccess.Read)
out_fs = New FileStream("abc2.xml", FileMode.OpenOrCreate, FileAccess.Write)
Dim DFS As DeflateStream = New DeflateStream(in_fs, CompressionMode.Decompress)
DFS.CopyTo(out_fs)
in_fs.Close()
out_fs.Close()
End Sub
End Class
在第一个XML(原始文件)中,结束行正确地结束了documentelement标记,如新的解压缩XML文件中的 DocumentElement BUT,此标记中缺少最后几个字符,它看起来像关注 DocumentElem 当我尝试再次阅读时,这会导致错误。 请帮助。
答案 0 :(得分:1)
始终使用Using
资源IDisposable
来避免此类问题:
Using in_fs = File.OpenRead("abc.xml")
Using out_fs = File.Create("def.cmp")
Using df_fs = New DeflateStream(out_fs, CompressionMode.Compress)
in_fs.CopyTo(df_fs)
End Using
End Using
End Using
Using in_fs = File.OpenRead("def.cmp")
Using out_fs = File.Create("abc2.xml")
Using df_fs = New DeflateStream(in_fs, CompressionMode.Decompress)
df_fs.CopyTo(out_fs)
End Using
End Using
End Using