web-dev-qa-db-ja.com

DotNetZipライブラリによってプログラムでZipファイルを抽出しますか?

Zipファイルを取得してディレクトリに抽出する関数があります( DotNetZip ライブラリを使用しています)。

public void ExtractFileToDirectory(string zipFileName, string outputDirectory)
{
     ZipFile Zip = ZipFile.Read(zipFileName);
     Directory.CreateDirectory(outputDirectory);
     Zip.ExtractAll(outputDirectory,ExtractExistingFileAction.OverwriteSilently);
}

Zipファイルに複数のファイルとディレクトリが含まれています。しかし、これらのファイルのすべてではなく、一部のみを抽出したいと思います。

どうすればこれを機能させることができますか?

32
Ehsan

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
39
Oded

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ドキュメントだけをお読みください。

21
misaxi

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句では任意のクエリ条件を使用できます。

13
Cheeso