2014-12-04 65 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