2010-11-02 44 views
0

我已经构建了一个web应用程序,用户可以从他的文件系统中选择一个zip文件(通过asp:FileUpload)。然后,应用程序解压缩zipfile和ftp的每个文件。SharpZipLib GetInputStream

下面的代码:

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)总是没有提供任何东西。

在此先感谢 伊沃

回答

0

一件事,你应该增加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#示例here,使用不同的方法GetNextEntry迭代压缩文件的列表。

+0

搬到开始并没有帮助。仍然是相同的结果。增量确实在错误的地方。但即使把它放在正确的位置也无济于事。我得到的条目是好的,如果我运行调试器,并且询问ze.Name,它会给出我的文件名;就像ze.Size为我提供了正确的文件大小。 (我也尝试了迭代,就像没有运气的c#示例) – Ivo 2010-11-02 18:59:00

+0

@ user495089 - 是我的评论还是下面的答案?对我来说,就像你在这里有一个简单的逻辑错误 – 2010-11-02 19:02:36

+0

您是否试过将未压缩的数据写入本地文件('FileStream')或'MemoryStream'而不是使用FTP? 'zf.GetInputStream()'属性的外观是什么?什么是“上传”的界面?只是一个'Stream',或者其他一些类作为参数3? – 2010-11-02 19:20:14

0

我认为你是在流的末尾,尝试移动到流的开头,所以你可以读到的一切。

str.Seek(0, SeekOrigin.Begin)