2013-03-26 3 views
0

Я пытаюсь разработать код для распаковки файла из zip-файла в Silverlight 5. Файлы находятся в каталоге в zip-файле.Unzip zip-файл в silverlight

Я перевел этот код, который я нашел в другом месте от 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 

ответ

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