如果我像这样流式传输一个zip文件:
using var zip = new ZipArchive(fileStream, ZipArchiveMode.Read);
using var sr = new StreamReader(zip.Entries[0].Open());
var line = sr.ReadLine(); //etc..
我是在流式传输zip文件条目,还是将整个zip文件加载到内存中,然后再流式传输未压缩的文件?
发布于 2020-08-04 06:41:54
这取决于fileStream
是如何创建的。它是从磁盘上的文件创建的吗?如果是,则ZipArchive
将在需要数据时从磁盘读取数据。它不会将整个内容放入内存,然后再读取它。这将是令人难以置信的低效。
我在这方面有很多经验...我在一个项目中工作,我必须解压25 GB。压缩文件。.NET的ZipArchive
速度非常快,内存效率也非常高。
您可以拥有包含ZipArchive
可以读取的数据的Zip s,因此您不仅限于磁盘上的MemoryStream
文件。
下面是一种稍微有效的解压缩ZipArchive
的方法
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。
https://stackoverflow.com/questions/63237807
复制相似问题