如何在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文件而不解压到新位置的主要内容,如果未能解决你的问题,请参考以下文章

Android查看zip文件而不解压

C#中如何获取程序的当前文件夹名称并将zip文件解压到当前文件夹? [复制]

如何用7 zip压缩和解压文件

解压文件而不创建文件夹

zip压缩包怎么解压

如何解压zip文件?