2014-12-04 67 views
0

以下是我用于压缩和解压缩目的的代码。我的目标是将数据表转换为XML,然后转换为二进制压缩格式,然后将其读回并将二进制转换回XML。所以,基本上,我将XML转换为二进制压缩,然后将压缩二进制转换回XML。从逻辑上讲,数据大小应该相同,但由于某种原因,新的解压缩XML文件丢失一个字节或更多。你们能帮我吗?压缩方法丢失一个或多个字节VB.NET

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标签正确像DocumentElement但新的解压缩XML文件中,最后几个字符从这个标签丢失,它看起来像以下DocumentElem 这会导致错误,当我尝试再次阅读它。 请协助。

+0

你永远不会关闭DeflateStream,但它仍然有没有得到刷新字节。查看关于DeflateStream的MSDN库文章,了解如何正确执行此操作。 – 2014-12-04 18:46:30

+0

@HansPassant谢谢你。我是否必须关闭文件流并按任何特定顺序缩小streeam?因为我编辑的代码来关闭deflatestream,但我仍然有同样的问题:( – 2014-12-04 19:15:47

回答

1

始终使用UsingIDisposable资源,以避免这种问题:

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 
+0

非常感谢,我花了整整一天的时间试图找出它,但不能,谢谢你。 – 2014-12-05 08:15:41