System.IO.Compressionを使用してZIPファイルを読み書きする方法は?

StackOverflow https://stackoverflow.com/questions/184309

  •  06-07-2019
  •  | 
  •  

質問

ZIPファイルを操作するためのライブラリがある。また、 Windowsに組み込まれている機能を使用してZIPファイルを処理する

しかし、.NET内のSystem.IO.Compression名前空間に組み込まれたツールを使用してZIPファイルを読み書きする方法を誰かが考え出したのだろうか?または、この名前空間のみを使用することはできませんか?

更新:System.IO.Packaging名前空間もこれに役立つとコメントしているようです。誰でもそれを行う方法を正確に知っていますか?

役に立ちましたか?

解決

MSDNには完全な < a href = "http://msdn.microsoft.com/en-us/library/system.io.packaging.zippackage.aspx" rel = "noreferrer"> http://msdn.microsoft.com/en-us/ library / system.io.packaging.zippackage.aspx をZipPackageクラスを使用して。 .NET 3.5が必要です。

他のヒント

デイブ、とてもいい!!そこにあるとは知りませんでした。

これで何を探すべきかがわかったので、使用方法に関する小さなコードサンプルを含む記事を見つけることができました。 http://weblogs.asp.net/jgalloway/archive/2007/10/25/creating-zip-archives-in-net-without-an-external-library-like-sharpziplib.aspx

関連するメモでは、非常に使いやすい DotNetZipプロジェクトも見つかりました。

http://www.codeplex.com/DotNetZip <などのサードパーティライブラリを使用します/a>。GZipStreamまたはDeflateStreamを使用してzipファイルを読み取ろうとするのではありません。

.NETの*** Streamクラスを使用すると、圧縮されたバイトストリームを読み書きできます。これらのクラスは、zipファイルの読み取りまたは書き込みを行いません。 zipファイルは、「エンベロープ」で囲まれた圧縮データです。またはヘッダー。それをメタデータと考えてください-ファイルの名前、タイムスタンプ、CRC、およびその他のものが含まれています。 ** Streamクラスは、圧縮データのストリームのみを生成し、メタデータを生成または消費する方法を知りません。これは、PKWareが管理するPKZip形式仕様で説明されています。

DotNetZipなどのサードパーティライブラリは、ZIPアーカイブ内のメタデータを処理します。 System.IO.Compression.DeflateStream()クラスを使用して、圧縮されたバイトストリームを生成する場合としない場合があります。たとえば、以前のリリースでは、DotNetZipは組み込みのDeflateStreamを使用していました。 v1.7の時点で、DotNetZipには独自のDeflateStreamが含まれており、.NET Frameworkに同梱されているものよりも効率的です。追加の利点として、DotNetZipに埋め込まれたDeflateStreamにより、System.IO.Compression.DeflateStreamのない.NET Compact Framework 2.0でDotNetZipを使用できます。 (Compact Framework 3.5で追加されました)

さらに質問がある場合は、DotNetZipサイトに良いフォーラムがあります。 C#コードの例:

    try
    {
        using (ZipFile zip = new ZipFile())
        {
            zip.AddDirectory(DirectoryToZip); // recurses subdirs
            zip.Save(Filename);
        }
    }
    catch (System.Exception ex1)
    {
        System.Console.Error.WriteLine("exception: " + ex1);
    }

.NET 4.5以降、Microsoftは ZipArchive クラスを System.IO.Compression 名前空間に追加します。ただし、 GZipStream Deflate ストリームなど、その名前空間の他のクラスとは異なり、 ZipArchive System.IOへの参照を必要とします。 Compression.dll アセンブリ。

使用するのは非常に簡単で、MSDNへの上記のリンクはいくつかの良い例を提供します。

さらに、Microsoftは Microsoft Compression NuGetパッケージを作成しました。 ZipArchive およびWindows Phone 8およびその他のポータブルクラスライブラリの関連クラスのサポート

古いスレッドは知っていますが、.NET 4.5がsystem.io.compressionに大幅な改善を加えたことを指摘したいと思います。 .zipファイルを非常にうまく処理できるようになりました。zip内の個々のファイルをストリーム対応として公開したり、ファイルを抽出および圧縮するステップなしで読み書きできるようになります。

はい、過去に使用しました。永続化をサポートするために、 DataSet を1回サブクラス化しました。ファイルへの出力( ReadXML を介して/ WriteXML メソッド)。追加のボーナスとして、必要に応じてオプションで圧縮できるようにすることにしました(これは、ご存知のとおり、XMLのようなテキストデータに対して非常に効果的です)。

GZipStream クラスを使用しました(関連する DeflateStream はヘッダー情報のない単なるGZip、またはそのようなものです(&#8212;誰かがこれを修正できると確信しています)。別のストリームの上にピギーバッキングすることで非常に簡単に機能するため、その場所でGZipStreamを使用します。私の場合、FileStreamに便乗していました。

MemoryStream を入力します myDataSet.WriteXML()の出力、次のようなことをしました:

if (CompressData)
{
    // Write to memory
    mStream = new MemoryStream();
    Save(mStream);
    mStream.Seek(0, SeekOrigin.Begin);

    // Filter that through a GZipStream and then to file
    fStream = new FileStream(Path.Combine(CacheFilePath, FileName + ".gz"),
                             FileMode.OpenOrCreate);
    zipStream = new GZipStream(fStream, CompressionMode.Compress, true);

    Pump(mStream, zipStream);
}
else
{
    // Write straight to file
    fStream = new FileStream(Path.Combine(CacheFilePath, FileName),
                             FileMode.OpenOrCreate);
    Save(fStream);
}

Save()および Pump()は次のような単純なメソッドです:

private void Pump(Stream input, Stream output)
{
    int n;
    byte[] bytes = new byte[4096]; // 4KiB at a time

    while ((n = input.Read(bytes, 0, bytes.Length)) != 0)
    {
        output.Write(bytes, 0, n);
    }
}

public void Save(Stream stream)
{
    AcceptChanges();

    WriteXml(stream, XmlWriteMode.WriteSchema);
}
    public static void zIpDatabseFile(string srcPath, string destPath)
    {//This is for  Zip a File
        using (var source = new FileStream(srcPath, FileMode.Open, FileAccess.Read, FileShare.Read))
        using (var dest = new FileStream(destPath, FileMode.OpenOrCreate, FileAccess.Write))
        using (var zip = new GZipStream(dest, CompressionMode.Compress))
        {
            source.CopyTo(zip);
        }
    }
    public static void uNzIpDatabaseFile(string SrcPath, string DestPath)
    {// This is for unzip a files.
        using (var source = new FileStream(SrcPath, FileMode.Open, FileAccess.Read, FileShare.Read))
        using (var dest = new FileStream(DestPath, FileMode.OpenOrCreate, FileAccess.Write))
        using (var zip = new GZipStream(source, CompressionMode.Decompress))
        {
            zip.CopyTo(dest);
        }
    }
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top