注意 - 这个答案提出了 SharpZipLib 的替代方案
DotNetZip在 ZipFile 类上有一个字符串索引器,使这变得非常容易。
using (ZipFile zip = ZipFile.Read(sourcePath)
{
zip["NameOfFileToUnzip.txt"].Extract();
}
您不需要摆弄输入流和输出流等,只需提取文件即可。另一方面,如果你想要流,你可以得到它:
using (ZipFile zip = ZipFile.Read(sourcePath)
{
Stream s = zip["NameOfFileToUnzip.txt"].OpenReader();
// fiddle with stream here
}
您还可以进行通配符提取。
using (ZipFile zip = ZipFile.Read(sourcePath)
{
// extract all XML files in the archive
zip.ExtractSelectedEntries("*.xml");
}
有重载来指定覆盖/不覆盖,不同的目标目录等。您还可以根据文件名以外的条件进行提取。例如,提取 2009 年 1 月 15 日之后的所有文件:
// extract all files modified after 15 Jan 2009
zip.ExtractSelectedEntries("mtime > 2009-01-15");
您可以结合标准:
// extract all files that are modified after 15 Jan 2009) AND larger than 1mb
zip.ExtractSelectedEntries("mtime > 2009-01-15 and size > 1mb");
// extract all XML files that are modified after 15 Jan 2009) AND larger than 1mb
zip.ExtractSelectedEntries("name = *.xml and mtime > 2009-01-15 and size > 1mb");
您不必提取您选择的文件。您可以选择它们,然后决定是否提取。
using (ZipFile zip1 = ZipFile.Read(ZipFileName))
{
var PhotoShopFiles = zip1.SelectEntries("*.psd");
// the selection is just an ICollection<ZipEntry>
foreach (ZipEntry e in PhotoShopFiles)
{
// examine metadata here, make decision on extraction
e.Extract();
}
}