ファイル全体を解凍せずにzipファイルからデータを読み取る方法


97

とにかく.Net(C#)には、ファイル全体を解凍せずにzipファイルからデータを抽出する方法はありますか?

単に私はおそらくzipファイルの最初からデータ(ファイル)を抽出したいだけです。明らかに、これは、圧縮アルゴリズムがファイルを確定的な順序で圧縮するかどうかに依存します。


回答:


78

DotNetZipはあなたの友達です。

簡単です:

using (ZipFile zip = ZipFile.Read(ExistingZipFile))
{
  ZipEntry e = zip["MyReport.doc"];
  e.Extract(OutputStream);
}

(ファイルまたは他の宛先に抽出することもできます)。

zipファイルの目次の読み取りは、次のように簡単です。

using (ZipFile zip = ZipFile.Read(ExistingZipFile))
{
  foreach (ZipEntry e in zip)
  {
    if (header)
    {
      System.Console.WriteLine("Zipfile: {0}", zip.Name);
      if ((zip.Comment != null) && (zip.Comment != "")) 
        System.Console.WriteLine("Comment: {0}", zip.Comment);
      System.Console.WriteLine("\n{1,-22} {2,8}  {3,5}   {4,8}  {5,3} {0}",
                               "Filename", "Modified", "Size", "Ratio", "Packed", "pw?");
      System.Console.WriteLine(new System.String('-', 72));
      header = false;
    }
    System.Console.WriteLine("{1,-22} {2,8} {3,5:F0}%   {4,8}  {5,3} {0}",
                             e.FileName,
                             e.LastModified.ToString("yyyy-MM-dd HH:mm:ss"),
                             e.UncompressedSize,
                             e.CompressionRatio,
                             e.CompressedSize,
                             (e.UsesEncryption) ? "Y" : "N");

  }
}

注を編集: DotNetZipは、Codeplexに住んでいたものです。Codeplexはシャットダウンされました。古いアーカイブは引き続きCodeplexで入手できます。コードがGithubに移行したようです:



9
+1。舞台裏では、DotNetZipがコンストラクタで行うことは、zipファイル内の「ディレクトリ」を探し、それを読み取ってエントリのリストにデータを入力することです。その時点で、アプリが1つのエントリでExtract()を呼び出すと、DotNetZipはzipファイル内の適切な場所を探し、そのエントリのみのデータを解凍します。
Cheeso

113

.Net Framework 4.5の場合(ZipArchiveを使用):

using (ZipArchive zip = ZipFile.Open(zipfile, ZipArchiveMode.Read))
    foreach (ZipArchiveEntry entry in zip.Entries)
        if(entry.Name == "myfile")
            entry.ExtractToFile("myfile");

zipfileで「myfile」を見つけて抽出します。


33
entry.Open()を使用して、ストリームを取得することもできます(コンテンツを読み取る必要があるが、ファイルに書き込まない場合)。
2014

17
参照:System.IO.Compression.dllおよびSystem.IO.Compression.FileSystem.dll
yzorg

18

SharpZipLibを使用する場合は、次のようにファイルを1つずつリストして抽出します。

var zip = new ZipInputStream(File.OpenRead(@"C:\Users\Javi\Desktop\myzip.zip"));
var filestream = new FileStream(@"C:\Users\Javi\Desktop\myzip.zip", FileMode.Open, FileAccess.Read);
ZipFile zipfile = new ZipFile(filestream);
ZipEntry item;
while ((item = zip.GetNextEntry()) != null)
{
     Console.WriteLine(item.Name);
     using (StreamReader s = new StreamReader(zipfile.GetInputStream(item)))
     {
      // stream with the file
          Console.WriteLine(s.ReadToEnd());
     }
 }

この例に基づく:zipファイル内のコンテンツ


1
率直に言って、このリンクが質問にどのように答えるかはわかりませんでした。
ユージーン・メイエフスキー「コールバック

10

UTF8テキストファイルをzipアーカイブから文字列変数に読み込む方法を次に示します(.NET Framework 4.5以降)。

string zipFileFullPath = "{{TypeYourZipFileFullPathHere}}";
string targetFileName = "{{TypeYourTargetFileNameHere}}";
string text = new string(
            (new System.IO.StreamReader(
             System.IO.Compression.ZipFile.OpenRead(zipFileFullPath)
             .Entries.Where(x => x.Name.Equals(targetFileName,
                                          StringComparison.InvariantCulture))
             .FirstOrDefault()
             .Open(), Encoding.UTF8)
             .ReadToEnd())
             .ToArray());

0

Zipファイルには目次があります。すべてのzipユーティリティには、目次のみを照会する機能が必要です。または、7zip -tのようなコマンドラインプログラムを使用して、目次を印刷し、テキストファイルにリダイレクトすることもできます。


0

このような場合、zipローカルヘッダーエントリを解析する必要があります。zipファイルに保存されている各ファイルには、先行するローカルファイルヘッダーエントリがあり、(通常)解凍に十分な情報が含まれています。一般に、ストリームでそのようなエントリを簡単に解析し、必要なファイルを選択し、ヘッダー+圧縮ファイルデータを他のファイルにコピーできます。ファイル、およびその部分でunzipを呼び出します(Zip解凍コードまたはライブラリ全体を処理したくない場合)。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.