SharpZipLib GetInputStream

Я создал веб-приложение, в котором пользователь может выбрать zip-файл из своей файловой системы (через asp:FileUpload). Затем приложение распаковывает zip-файл и каждый файл ftp.

вот код:

Public Sub Unzip(ByVal str As Stream, ByVal constr As String)
    Dim zf As New ZipFile(str)
    Dim ze As ZipEntry
    Dim i As Integer = 0
    While i < zf.Count
        ze = zf.EntryByIndex(i)
        i = i + 1
        Dim ftp As New ftpItem(constr)
        ftp.upload(ze.Name, "pic", zf.GetInputStream(i), ze.Name, ze.Name)

    End While
    zf.Close() 
End Sub

Класс ftpItem — это мой собственный класс, который обрабатывает файлы ftp. ftp.upload в качестве третьего параметра требуется поток для отправляемого файла.

Но почему-то zf.GetInputStream(i) всегда ничего не дает.


person Ivo    schedule 02.11.2010    source источник


Ответы (2)


Во-первых, вы должны увеличивать i внутри цикла ПОСЛЕ, когда вы вызываете GetInputStream. Думаю, если есть только один файл, эта логика всегда будет давать сбой.

While i < zf.Count
    ze = zf.EntryByIndex(i)

    Dim ftp As New ftpItem(constr)
    ftp.upload(ze.Name, "pic", zf.GetInputStream(i), ze.Name, ze.Name)

    i = i + 1

End While

Если это не сработает, есть предположительно работающий пример C# здесь с использованием другой метод GetNextEntry для повторения списка сжатых файлов.

person Steve Townsend    schedule 02.11.2010
comment
Переход в начало не помогает. все тот же результат. приращение действительно было не в том месте. Но даже правильное размещение не помогает. Записи, которые я получаю, хороши, если я запускаю отладчик и спрашиваю ze.Name, он дает мне имена файлов; точно так же, как ze.Size дает мне правильный размер файлов. (Я также пробовал повторять, как пример С#, но безуспешно) - person Ivo; 02.11.2010
comment
@ user495089 - это комментарий для меня или ответ ниже? Мне кажется, что у вас здесь простая логическая ошибка - person Steve Townsend; 02.11.2010
comment
Пробовали ли вы просто записывать несжатые данные в локальный файл (FileStream) или MemoryStream вместо использования FTP? Как выглядят свойства на zf.GetInputStream()? Что это за интерфейс к upload? Просто Stream или какой-то другой класс в качестве параметра 3? - person Steve Townsend; 02.11.2010
comment
@Ivo - отлично, рад это слышать - person Steve Townsend; 03.11.2010

Я думаю, что вы в конце потока, попробуйте перейти к началу потока, чтобы вы могли прочитать все.

str.Seek(0, SeekOrigin.Begin)
person Chris Kooken    schedule 02.11.2010