注 - この回答は、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();
}
}