在Silverlight中解压缩zip文件

时间:2013-03-26 14:22:11

标签: silverlight zip silverlight-5.0

我正在尝试开发代码以从Silverlight 5中的zip文件解压缩文件。这些文件位于zip文件中的目录中。

我将从c#到其他地方找到的代码翻译成VB,因为我们是VB商店。它在第四行“对象引用未设置为对象的实例”上失败。 我现在意识到问题是第三行是期待一个相对的uri而我正在传递一个文件,但我不知道如何解决这个问题。

你能告诉我这段代码有什么问题吗?我也欢迎其他想法。

感谢。

Public Shared Function GetZipContents(ByVal filename As String) As String()

        Try



            Dim zipStream As System.IO.Stream = New System.IO.MemoryStream()
            Dim zipInfo As New StreamResourceInfo(zipStream, Nothing)
            Dim streamInfo As StreamResourceInfo = Application.GetResourceStream(zipInfo, New Uri(filename, UriKind.Relative))
            Dim fileStream As Stream = streamInfo.Stream

        Dim names As New List(Of String)()
        Dim reader As New BinaryReader(fileStream)
        Do While reader.ReadUInt32() = &H4034B50

            ' Skip the portions of the header we don't care about
            reader.BaseStream.Seek(14, SeekOrigin.Current)
            Dim compressedSize As UInteger = reader.ReadUInt32()
            Dim uncompressedSize As UInteger = reader.ReadUInt32()
            Dim nameLength As Integer = reader.ReadUInt16()
            Dim extraLength As Integer = reader.ReadUInt16()
            Dim nameBytes() As Byte = reader.ReadBytes(nameLength)
            names.Add(Encoding.UTF8.GetString(nameBytes, 0, nameLength))
            reader.BaseStream.Seek(extraLength + compressedSize, SeekOrigin.Current)

        Loop
        ' Move the stream back to the begining
        fileStream.Seek(0, SeekOrigin.Begin)
        Return names.ToArray()
        Catch ex As Exception
            MessageBox.Show(ex.Message)
            Return Nothing
        End Try
    End Function

3 个答案:

答案 0 :(得分:0)

在Silverlight中解压缩的方法很快捷。 使用Application.GetResourceStream方法。 http://msdn.microsoft.com/en-us/library/cc190632(v=vs.95).aspx

答案 1 :(得分:0)

答案 2 :(得分:0)

抱歉,我有时间探讨这些建议。我确实找到了一种方法来实现自己的目标。请参阅下面的代码。我将使用此代码,因为技术领导者更喜欢使用WCF服务以不同的方式执行此操作。警告我无法100%测试此代码,因为我不打算使用它,但它接近正确。

导入ICSharpCode.SharpZipLib.Zip

Public Shared Sub UnZip(ByVal SrcFile As String, ByVal DstFile As String, ByVal BufferSize As Integer)

    Try
        Dim _FileName As String
        Dim _ZipEntry As ZipEntry
        Dim _FileStreamOut As FileStream = Nothing
        Dim _Done As Boolean = False


        Dim _FileStreamIn As New FileStream(SrcFile, FileMode.Open, FileAccess.Read)
        Dim _ZipInStream As New ZipInputStream(_FileStreamIn)


        Do Until _Done = True
            _ZipEntry = _ZipInStream.GetNextEntry()
            If IsNothing(_ZipEntry) Then
                _Done = True
                Exit Do
            End If
            _FileName = DstFile & "\" & _ZipEntry.Name
            _FileName = _FileName.Replace("/", "\")

            If Right(_FileName, 1) = "\" Then
                If Directory.Exists(_FileName) = False Then
                    Directory.CreateDirectory(_FileName)
                End If
            Else
                _FileStreamOut = New FileStream(_FileName, FileMode.Create, FileAccess.Write)

                Dim size As Integer
                Dim buffer(BufferSize - 1) As Byte
                Do
                    size = _ZipInStream.Read(buffer, 0, buffer.Length)
                    _FileStreamOut.Write(buffer, 0, size)
                Loop While size > 0
            End If
        Loop

        _ZipInStream.Close()
        _FileStreamOut.Close()
        _FileStreamIn.Close()
    Catch ex As Exception
        MessageBox.Show(ex.Message)

    End Try


End Sub
相关问题