web-dev-qa-db-ja.com

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

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

単純に、Zipファイルの先頭からデータ(ファイル)を抽出したいだけです。明らかに、これは、圧縮アルゴリズムが決定的な順序でファイルを圧縮するかどうかに依存します。

89
AwkwardCoder

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に移行したようです:


77
Nicholas Carey

.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」を見つけて展開します。

100
Sinatr

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ファイル内のコンテンツ

18
Javi

以下に、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());
6
ShamilS

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

0

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

0
umilmi81