如何在c#中解压.zip文件而不解压到新位置
Posted
技术标签:
【中文标题】如何在c#中解压.zip文件而不解压到新位置【英文标题】:How to decompress .zip files in c# without extracting to new location 【发布时间】:2017-06-21 18:28:41 【问题描述】:如何在不解压到 .net 框架中的新位置的情况下解压缩 (.zip) 文件?具体来说,我正在尝试将 filename.csv.zip 读入 DataTable。 我知道 .extractToDirectory (在 ZipArchive 中),但我只想将它提取到 c# 中的一个对象中,我不想创建一个新文件。 希望能够在没有第三方库的情况下做到这一点,但我会尽我所能。
【问题讨论】:
ZipArchiveEntry.Open() 为您提供了一个 Stream 对象,允许您读取 Zip 存档条目的解压缩数据。 【参考方案1】:可能是一些错误,因为我从未测试过,但你去吧:
List<byte[]> urmom = new List<byte[]>();
using (ZipArchive archive = ZipFile.OpenRead(zipPath))
foreach (ZipArchiveEntry entry in archive.Entries)
using (StreamReader r = new StreamReader(entry.Open()))
urmom.Add(r.ReadToEnd(entry));
基本上,您使用 ZipArchive 的 openread 类来遍历每个条目。此时,您可以使用流式阅读器读取每个条目。从那里您可以从流中创建一个文件,甚至可以根据需要读取文件名。我的代码没有这样做,我有点懒惰。
【讨论】:
【参考方案2】:请记住,压缩流可能包含多个文件。要解决此问题,需要遍历 zip 文件的所有条目,以便检索它们并单独处理。 下面的示例转换字符串列表中的字节序列,其中每个字节都是压缩文件夹中包含的文件的上下文:
public static IEnumerable<string> DecompressToEntriesTextContext(byte[] input)
var zipEntriesContext = new List<string>();
using (var compressedStream = new MemoryStream(input))
using (var zip = new ZipArchive(compressedStream, ZipArchiveMode.Read))
foreach(var entry in zip.Entries)
using (var entryStream = entry.Open())
using (var memoryEntryStream = new MemoryStream())
using (var reader = new StreamReader(memoryEntryStream))
entryStream.CopyTo(memoryEntryStream);
memoryEntryStream.Position = 0;
zipEntriesContext.Add(reader.ReadToEnd());
return zipEntriesContext;
【讨论】:
以上是关于如何在c#中解压.zip文件而不解压到新位置的主要内容,如果未能解决你的问题,请参考以下文章