2013-04-18 90 views
0

我想从流中创建一个zip文件并返回一个流,我的问题是我不想将任何数据存储在本地硬盘中或记忆。我使用Ionic.Zip图书馆使用Ionic.Zip进行动态压缩c#

 Stream output = new MemoryStream(); 
     using (ZipFile zip = new ZipFile()) 
     { 
      Stream s = ftpManager.GetFileStream("/mydoc.docx"); 
      ZipEntry e = zip.AddEntry("Content-From-Stream.bin", s); 
      e.Comment = "The content for entry in the zip file was obtained from a stream"; 
      //zip.AddFile("Readme.txt"); 
      zip.Save(output); 
     } 
     if (output != null) 
     { 
      ftpManager.Upload(output, "/MohamedTest/mydoc.zip"); 
     } 

有在代码中的许多问题,

  • 首先,我使用的MemoryStream这是不可取的
  • 二,压缩文件是经过压缩

任何建议

+0

我很好奇,为什么downvote?这似乎是一个很好的合理的问题 – Steve

+0

你的内存/磁盘空间问题不能简单地解决。为了将文件上传到ftp,您需要知道它的大小(使用FtpWebRequest,在上传文件之前需要设置内容大小)。压缩文件的大小只有在存档完全压缩后才能知道。您获得的唯一选择是内存和磁盘空间使用情况。 –

+0

@KamilKrasinski我认为我可以从流中获取文件大小,因为我已经对压缩文件进行了流式处理,但问题是由于大文件而导致该流在内存中存储。我想避免这样的事情 –

回答

1

最有可能的结果输出离子被设置为压缩后的流尾,请检查。 而且,除非您将实现一些代理服务器流(它将处理.Write方法并将此数据发送到FTP),否则您需要使用内存/文件流来存储压缩数据。

+1

感谢@Nickolay,解决上传问题我设置流的位置为零后zip完成,并且工作正常 但我仍然有使用内存流的问题 –

+0

其实,为什么使用MemoryStream是一个问题? –

+1

使用MemoryStream是一个问题,因为我使用内存来存储数据,而不是在磁盘上存储数据,这是一个很大的问题,因为如果用户有一个大文件说2千兆我必须将该文件放入内存并等待文件在内存中作为流下载,然后完成我的逻辑想象如果有2或3个用户我需要什么大小的内存 –