不在磁盘上创建ZIP文件条目,如何实现?

4

我正在尝试创建一个程序,可以根据用户输入创建一个包含文件的压缩包。

在压缩之前,我不需要这些文件被写入硬盘,因为这是不必要的。那么,如何在不实际写入硬盘的情况下创建这些文件,并将它们压缩?

我正在使用DotNetZip。

3个回答

4

请查看文档此处,特别是名为“使用从流获取的内容创建压缩包”的示例:

 using (ZipFile zip = new ZipFile())
  {
    ZipEntry e= zip.AddEntry("Content-From-Stream.bin", "basedirectory", StreamToRead);
    e.Comment = "The content for entry in the zip file was obtained from a stream";
    zip.AddFile("Readme.txt");
    zip.Save(zipFileToCreate);
  }

如果您的文件还没有以流格式存在,那么您需要将它们转换为流格式。您可能需要使用MemoryStream来完成此操作。


0

我使用SharpZipLib,但是如果DotNetZip可以针对基本的System.IO.Stream执行所有操作,那么只需提供一个MemoryStream进行写入即可。


0

将数据写入硬盘不应该被视为不必要的。这是错误的想法。如果没有必要在内存中完成整个压缩过程,那么通过将数据写入硬盘来避免。

相比内存,硬盘更适合存储大量数据。如果你的压缩文件大小约为1GB,你的应用程序可能会崩溃或至少导致系统变慢。如果直接将数据写入硬盘,则可以创建几个GB大小的压缩文件而不会出现问题。


2
如果数据已经在内存中,则将其写入硬盘,然后再读取并压缩它是没有意义的。因此,你的说法“避免将数据写入硬盘是不必要的”是不正确的。 - Trisped
1
压缩文件不会超过1兆字节,可以包含多达200个文件(相对较小的文件),因此将所有这些文件写入硬盘,然后进行压缩是低效的。 - user1008784
@SpencerRuport - 我不确定。避免使用硬盘,通常是系统中最慢的部分,对我来说似乎是个好主意。前提是您对问题领域有足够的了解,可以相当确定您不会突然遇到一个多GB的文件,破坏您的系统,并且您不需要中间备份以防其他处理失败。 - Bobson
@Bobson - 针对特定情况,我会不建议使用硬盘,但在我看来,大多数情况下写入延迟会相当微不足道。你不仅需要知道文件本身不会超出可管理的大小,而且这段代码不会容易受到 DoS 攻击,其中请求让该代码运行被洪水般地发送到系统中。话虽如此,我并不期望每个人都同意这种做法,我只是觉得提供一个对此事有反对意见的观点是值得的。 - Spencer Ruport
@SpencerRuport - 对立的观点总是值得一提的。虽然我不完全同意(在某些情况下),但这就是对立的原因。+1。 - Bobson
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接