2013-03-19 124 views
0

我有一个使用BZip2压缩文件然后将其保存到新文件的程序。无法解压缩使用BZip2压缩的文件

Public Sub Create(ByVal outPathname As String, ByVal filePath As String) 
    Dim msCompressed As New MemoryStream() 
    Dim zosCompressed As New BZip2OutputStream(msCompressed) 
    Dim fileInput As New FileStream(filePath, FileMode.Open) 
    Dim buffer As Byte() = GetStreamAsByteArray(fileInput) 
    zosCompressed.Write(buffer, 0, buffer.Length) 
    zosCompressed.Flush() 
    zosCompressed.Close() 
    buffer = msCompressed.ToArray() 
    Dim FileOutput As New FileStream(outPathname, FileMode.Create, FileAccess.Write) 
    FileOutput.Write(buffer, 0, buffer.LongLength) 
    FileOutput.Flush() 
    FileOutput.Close() 
End Sub 

但我似乎无法弄清楚为什么我无法解压缩它创建的文件。有人可以告诉我我的解压缩程序有什么问题吗? (这是在比压缩机一个单独的程序。)

Public Sub Extract(ByVal archiveFilenameIn As String, ByVal outFolder As String) 
    Dim fileInput As New FileStream(archiveFilenameIn, FileMode.Open) 
    Dim msUncompressed As New MemoryStream(GetStreamAsByteArray(fileInput)) 
    Dim zosDecompressed As New BZip2InputStream(msUncompressed) 
    Dim buffer As Byte() = GetStreamAsByteArray(fileInput) 
    zosDecompressed.Read(buffer, 0, buffer.Length()) 
    buffer = msUncompressed.ToArray() 
    Dim FileOutput As New FileStream(outFolder & "\temporary.bmp", FileMode.Create, FileAccess.Write) 
    FileOutput.Write(buffer, 0, buffer.LongLength) 
    FileOutput.Flush() 
    FileOutput.Close() 
    zosDecompressed.Close() 
    msUncompressed.Close() 
    fileInput.Close() 
End Sub 

编辑:我还使用一个功能流转换为字节数组的位置:

Private Function GetStreamAsByteArray(ByVal stream As System.IO.Stream) As Byte() 
    Dim streamLength As Integer = Convert.ToInt32(stream.Length) 
    Dim fileData As Byte() = New Byte(streamLength) {} 

    ' Read the file into a byte array 
    stream.Read(fileData, 0, streamLength) 
    stream.Close() 

    Return fileData 
End Function 

帮助?

回答

0

尝试在使用写入数据之前完成BZip2OutputStream。这对我很有帮助。

zosCompressed.Finalize(); 
buffer = msCompressed.ToArray(); 

BZip2OutputStream usage example

+0

这样做的用处是有限的,因为调用'Finalize()'关闭底层内存流并完全破坏了压缩内存流的目的。 – ajeh 2016-05-17 20:37:14