Zipファイルを取得してディレクトリに抽出する関数があります( DotNetZip ライブラリを使用しています)。
public void ExtractFileToDirectory(string zipFileName, string outputDirectory)
{
ZipFile Zip = ZipFile.Read(zipFileName);
Directory.CreateDirectory(outputDirectory);
Zip.ExtractAll(outputDirectory,ExtractExistingFileAction.OverwriteSilently);
}
Zipファイルに複数のファイルとディレクトリが含まれています。しかし、これらのファイルのすべてではなく、一部のみを抽出したいと思います。
どうすればこれを機能させることができますか?
各 ZipEntry をテストして、抽出するかどうかを確認する必要があります。
public void ExtractFileToDirectory(string zipFileName, string outputDirectory)
{
ZipFile Zip = ZipFile.Read(zipFileName);
Directory.CreateDirectory(outputDirectory);
foreach (ZipEntry e in Zip)
{
// check if you want to extract e or not
if(e.FileName == "TheFileToExtract")
e.Extract(outputDirectory, ExtractExistingFileAction.OverwriteSilently);
}
}
。
ZipFile Zip = ZipFile.Read(zipFileName); //Runs in framework 4.5
ZipFileクラスにはExtractSelectedEntriesメソッドがあります。メソッドシグネチャは次のとおりです。
public void ExtractSelectedEntries(string selectionCriteria, string directoryPathInArchive, string extractDirectory, ExtractExistingFileAction extractExistingFile)
したがって、プログラムでは、selectionCriteriaを指定することで、指定したファイルを簡単に抽出できます。
public void ExtractFileToDirectory(string zipFileName, string outputDirectory)
{
ZipFile Zip = ZipFile.Read(zipFileName);
Directory.CreateDirectory(outputDirectory);
Zip.ExtractSelectedEntries("name = *.doc", "document\", outputDirectory, ExtractExistingFileAction.OverwriteSilently);
}
条件を論理積ANDまたはORと組み合わせることができます。 selectionCriteriaに「name = * .txt AND size> = 100k」のような文字列を使用すると、名前が.txtで終わり、非圧縮サイズが100キロバイト以上のエントリが取得されます。
ここにいくつかの基準サンプルがあります
基準(取得したファイル)
name!= * .xls(.xls以外の拡張子を持つファイル)
name = * .mp3(拡張子が.mp3のファイル)
* .mp3(上記と同じ、拡張子が.mp3のファイル)
attributes = A(属性にアーカイブビットが含まれるすべてのファイル)
attributes!= H(属性に隠しビットが含まれないすべてのファイル)
mtime> 2009-01-01(2009年1月1日より後の最終変更時刻を持つすべてのファイル)
サイズ> 2GB(非圧縮サイズが2GBより大きいすべてのファイル)
詳細については、ライブラリと一緒にAPIドキュメントだけをお読みください。
LINQを使用して、抽出するエントリを選択することもできます。例えば:
using (var Zip = ZipFile.Read(ArchiveToRead))
{
var selection = from e in Zip.Entries
where System.IO.Path.GetFileName(e.FileName).StartsWith("C")
select e;
foreach (var e in selection)
e.Extract(extractDir);
}
もちろん、where
句では任意のクエリ条件を使用できます。