0

Silverlight5のzipファイルからファイルを解凍するコードを開発しようとしています。ファイルはzipファイル内のディレクトリにあります。

私たちはVBショップなので、他の場所で見つけたこのコードをc#からVBに翻訳しました。4行目の「オブジェクト参照がオブジェクトのインスタンスに設定されていません。」で失敗しています。問題は、3行目が相対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
4

3 に答える 3

0

Silverlightで解凍するには、すばやく汚い方法があります。Application.GetResourceStreamメソッドを使用します。 http://msdn.microsoft.com/en-us/library/cc190632(v=vs.95).aspx

于 2013-03-26T14:25:36.643 に答える
0

これに関する私のブログ投稿をチェックしてください:http://www.sharpgis.net/post/2010/08/25/REALLY-small-unzip-utility-for-Silverlight-e28093-Part-2.aspx

于 2013-03-26T14:38:35.987 に答える
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
于 2013-04-03T16:30:36.913 に答える