在 Silverlight 中解压缩 zip 文件 [英] Unzip a zip file in silverlight

查看:53
本文介绍了在 Silverlight 中解压缩 zip 文件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I am trying to develop code to unzip file from the zip file in Silverlight 5. The files are in a directory within the zip file.

我将我在别处找到的这段代码从 c# 翻译成 VB,因为我们是一家 VB 商店.它在第四行对象引用未设置为对象的实例"失败.我现在意识到问题是第三行需要一个相对的 uri,我正在向它传递一个文件,但我不知道如何解决这个问题.

I translated this code I found elsewhere from c# to VB since we are a VB shop. It is failing on the fourth line "Object reference not set to an instance of an object.". I realize now that the problem is that the third line is expecting a relative uri and I am passing it a file, but I don't know how to fix this.

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

Can you tell me what is wrong with this code. I will also welcome other ideas.

谢谢.

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

推荐答案

抱歉,我有时间探索这些建议.我确实找到了一种方法来实现我自己的目标.请参阅下面的代码.我会使用此代码,因为这里的技术负责人更喜欢我使用 WCF 服务以不同的方式执行此操作.警告我无法 100% 测试此代码,因为我不打算使用它,但它几乎是正确的.

Sorry I would have time to explore the suggestions. I did find a way to accomplish my goal on my own. See the code below. I would be using this code either because the Technical Leader here prefers I do it a different way using a WCF service. Warning I was not able to test this code 100% since I am not planning to use it, but it is close to being right.

导入 ICSharpCode.SharpZipLib.Zip

Imports 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

这篇关于在 Silverlight 中解压缩 zip 文件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆