首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >ZipArchive是否将整个压缩文件加载到内存中

ZipArchive是否将整个压缩文件加载到内存中
EN

Stack Overflow用户
提问于 2020-08-04 06:34:58
回答 1查看 149关注 0票数 1

如果我像这样流式传输一个zip文件:

代码语言:javascript
运行
复制
using var zip = new ZipArchive(fileStream, ZipArchiveMode.Read);
using var sr = new StreamReader(zip.Entries[0].Open());
var line = sr.ReadLine(); //etc..

我是在流式传输zip文件条目,还是将整个zip文件加载到内存中,然后再流式传输未压缩的文件?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-08-04 06:41:54

这取决于fileStream是如何创建的。它是从磁盘上的文件创建的吗?如果是,则ZipArchive将在需要数据时从磁盘读取数据。它不会将整个内容放入内存,然后再读取它。这将是令人难以置信的低效。

我在这方面有很多经验...我在一个项目中工作,我必须解压25 GB。压缩文件。.NET的ZipArchive速度非常快,内存效率也非常高。

您可以拥有包含ZipArchive可以读取的数据的Zip s,因此您不仅限于磁盘上的MemoryStream文件。

下面是一种稍微有效的解压缩ZipArchive的方法

代码语言:javascript
运行
复制
var di = new DirectoryInfo(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData), "MyDirectoryToExtractTo"));

var filesToExtract = _zip.Entries.Where(x =>
                                        !string.IsNullOrEmpty(x.Name) &&
                                        !x.FullName.EndsWith("/", StringComparison.Ordinal));

foreach(var x in filesToExtract)
{
    var fi = new FileInfo(Path.Combine(di.FullName, x.FullName));
    
    if (!fi.Directory.Exists) { fi.Directory.Create(); }
    
    using (var i = x.Open())
    using (var o = fi.OpenWrite())
    {
        i.CopyTo(o);
    }
}

这会将所有文件解压到C:\ProgramData\MyDirectoryToExtractTo\中,并保留目录结构。

如果您想了解ZipArchive是如何实现的,请使用look here

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63237807

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档