20

ZIP ファイルを操作するためのライブラリが世の中にあることは知っています。また、Windows に組み込まれている機能を使用して ZIP ファイルを操作することもできます。

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

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

4

8 に答える 8

17

MSDNには、ZipPackageクラスを使用した完全な http://msdn.microsoft.com/en-us/library/system.io.packaging.zippackage.aspxがあります。.NET3.5が必要です。

于 2008-10-08T19:04:05.397 に答える
7

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

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

関連するメモとして、非常に使いやすいDotNetZipプロジェクトも見つけました。

于 2008-10-08T19:13:06.627 に答える
7

GZipStream や DeflateStream を使用して zip ファイルを読み取ろうとするのではなく、http://www.codeplex.com/DotNetZipなどのサードパーティ ライブラリを使用することをお勧めします。

.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);
    }
于 2009-01-04T03:41:36.953 に答える
1

パッケージ化名前空間を使用した.NETFrameworkZip/UnZipツール

于 2008-10-08T19:46:16.120 に答える
0

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

私はGZipStreamクラスを使用しました(関連するDeflateStreamはヘッダー情報などのないGZipであるとのことでしたが、誰かがこれを修正できると確信しています)。別のストリームの上にピギーバックするだけで非常に簡単に機能するため、代わりに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);
}
于 2008-10-08T19:46:39.053 に答える
0
    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);
        }
    }
于 2013-05-24T06:38:02.973 に答える