【问题标题】:How to decompress .zip files in c# without extracting to new location如何在c#中解压.zip文件而不解压到新位置
【发布时间】:2017-06-21 18:28:41
【问题描述】:

如何在不解压到 .net 框架中的新位置的情况下解压缩 (.zip) 文件?具体来说,我正在尝试将 filename.csv.zip 读入 DataTable。 我知道 .extractToDirectory (在 ZipArchive 中),但我只想将它提取到 c# 中的一个对象中,我不想创建一个新文件。 希望能够在没有第三方库的情况下做到这一点,但我会尽我所能。

【问题讨论】:

  • ZipArchiveEntry.Open() 为您提供了一个 Stream 对象,允许您读取 Zip 存档条目的解压缩数据。

标签: c# zip compression


【解决方案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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-02-25
      • 2018-06-19
      • 1970-01-01
      • 1970-01-01
      • 2017-05-13
      相关资源
      最近更新 更多