0

以下是我用于压缩和解压缩目的的代码。我的目标是将数据表转换为 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但一样,此标记中缺少最后几个字符,看起来像遵循DocumentElem 这在我尝试时会导致错误再读一遍。请协助。

4

1 回答 1

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
于 2014-12-04T20:55:19.783 回答