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