【问题标题】:Zip and Unzip within Memorystream在 Memorystream 中压缩和解压缩
【发布时间】:2018-09-12 14:43:42
【问题描述】:

我正在尝试将一些文件保存在字符串中。

文件被压缩,压缩文件读取为字节数组,字节数组使用Convert.ToBase64String转换为字符串。

当我过去创建一个实际的 Zip-File 时它可以工作,但现在我尝试在 MemoryStream 中执行它并且我得到:

FileFormatException:“文件包含损坏的数据。”

这是我用来诊断问题的函数:

Private Sub PushToBase64StringStream(tSourceDirPath As String)
    Dim byteArray() As Byte

    Using cStream As New MemoryStream
        ZipManagedFilesStream(cStream, tSourceDirPath)

        cStream.Seek(0, SeekOrigin.Begin)
        byteArray = New Byte(CType(cStream.Length, Integer)) {}
        cStream.Read(byteArray, 0, CInt(cStream.Length))
        'Base64String = Convert.ToBase64String(byteArray)

        ' This statement works
        Using cPackage As Package = Package.Open(cStream, FileMode.Open, FileAccess.Read)
    End Using

    Using cStream2 As New MemoryStream
        cStream2.Write(byteArray, 0, byteArray.Length)
        cStream2.Seek(0, SeekOrigin.Begin)

        ' This statement fails
        Using cPackage As Package = Package.Open(cStream2, FileMode.Open, FileAccess.Read)
        End Using
    End Using

End Sub

在第一个 Using-Statement 中,我使用原始流调用了 Unzip-Function,它可以工作。在第二个 Using-Statement 中,我使用一个新的 Stream 调用 Unzip-Function,该 Stream 填充了原始 byteArray 并且它失败了,声称文件已损坏。

Private Sub ZipManagedFilesStream(cStream As Stream, tSourceDirectory As String)
    Using cPackage As Package = Package.Open(cStream, FileMode.Create)
        For Each cFile As FileInfo In ManagedFiles(tSourceDirectory)

            Dim tType As String = Net.Mime.MediaTypeNames.Application.Zip
            Dim cPartUri As New Uri("/" & cFile.Name, UriKind.Relative)
            Dim cPackagePart As PackagePart = cPackage.CreatePart(cPartUri, tType, CompressionOption.Normal)

            Using cSourceStream As New FileStream(cFile.FullName, FileMode.Open, FileAccess.Read),
                  cTargetStream As Stream = cPackagePart.GetStream
                cSourceStream.CopyTo(cTargetStream)
            End Using
        Next
    End Using
End Sub

【问题讨论】:

    标签: .net vb.net stream


    【解决方案1】:

    抱歉,如果有人试图深入研究这个问题 - 我自己发现了问题。它位于这条线内:

    byteArray = New Byte(CType(cStream.Length, Integer)) {}
    

    ByteArray 太长了 1 个字节。我已将其更改为:

    byteArray = New Byte(CType(cStream.Length - 1, Integer)) {}
    

    现在可以了。


    编辑:这样做要容易得多:

    Using cStream As New MemoryStream
        ZipManagedFilesStream(cStream, tSourceDirPath)
        Base64String = Convert.ToBase64String(cStream.ToArray)
    End Using
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多