34

ZIPファイルを取得してディレクトリに展開する機能があります(DotNetZipライブラリを使用しています)。

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

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

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

4

3 に答える 3

44

各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);
      }
}
于 2010-02-24T08:42:54.440 に答える
20

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 (属性に Hidden ビットが含まれていないすべてのファイル)

mtime > 2009-01-01 (最終変更時刻が 2009 年 1 月 1 日以降のすべてのファイル)

サイズ > 2GB (非圧縮サイズが 2GB を超えるすべてのファイル)


詳細については、ライブラリと一緒に API ドキュメントだけを読む必要があります。

于 2010-02-25T08:28:12.153 に答える
14

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句で必要な任意のクエリ基準を使用できます。

于 2010-02-26T02:32:06.940 に答える