如何在c#中解压缩.zip文件而不解压缩到新位置

时间:2017-06-21 18:28:42

标签: c# zip compression

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

2 个答案:

答案 0 :(得分: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类来遍历每个条目。此时,您可以使用streamreader读取每个条目。从那里你可以从流创建一个文件,如果你愿意,甚至可以读取文件名。我的代码没有这样做,我的一点懒惰。

答案 1 :(得分:0)

请记住,压缩流可能包含多个文件。为了解决这个问题,需要遍历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;
}