47


2

C#のファイルやフォルダをすばやく圧縮または解凍する良い方法を知っている人はいますか? 大きなファイルを扱う必要があるかもしれません。

9 Answer


27


Net 2.0フレームワークの名前空間 System.IO.Compression`はGZipとDeflateアルゴリズムをサポートします。 ファイルオブジェクトから取得できるバイトストリームを圧縮および解凍する2つの方法があります。 以下のメソッドで `DefaultStream`の代わりに GZipStream`を代用してそのアルゴリズムを使うことができます。 しかしながら、これは依然として異なるアルゴリズムで圧縮されたファイルを扱うという問題を残しています。
public static byte[] Compress(byte[] data)
{
    MemoryStream output = new MemoryStream();

    GZipStream gzip = new GZipStream(output, CompressionMode.Compress, true);
    gzip.Write(data, 0, data.Length);
    gzip.Close();

    return output.ToArray();
}

public static byte[] Decompress(byte[] data)
{
    MemoryStream input = new MemoryStream();
    input.Write(data, 0, data.Length);
    input.Position = 0;

    GZipStream gzip = new GZipStream(input, CompressionMode.Decompress, true);

    MemoryStream output = new MemoryStream();

    byte[] buff = new byte[64];
    int read = -1;

    read = gzip.Read(buff, 0, buff.Length);

    while (read > 0)
    {
        output.Write(buff, 0, read);
        read = gzip.Read(buff, 0, buff.Length);
    }

    gzip.Close();

    return output.ToArray();
}


23


私はいつもSharpZip Libraryを使ってきました。

http://sharpdevelop.net/OpenSource/SharpZipLib/Download.aspx[こちらのリンク]


11



9


Tomが指摘したように、あなたは SharpZipのようなサードパーティのライブラリを使うことができます。

もう1つの方法は(サードパーティ製ではありません)WindowsシェルAPIを使用することです。 C#プロジェクトで、Microsoft Shell Controls and Automation COMライブラリへの参照を設定する必要があります。 Gerald Gibsonの例があります。

  • http://geraldgibson.net/dnn/Home/CZipFileCompression/tabid/148/Default.aspx*

    http://web.archive.org/web/20130724085455/http://geraldgibson.net/dnn/Home/CZipFileCompression/tabid/148/Default.aspx[インターネットアーカイブのデッドページのコピー]


8


私の答えはあなたの目を閉じて DotNetZipを選ぶでしょう。 大規模なコミュニティによってテストされています。


6


これはjavaでは非常に簡単で、上記のようにC#からjava.util.zipライブラリにアクセスできます。 参考文献については、以下を参照してください。

http://java.sun.com/j2se/1.4.2/docs/api/java/util/zip/package-summary.html[java.util.zip javadocs] http://www.devx.com/getHelpOn / 10MinuteSolution / 20447 [サンプルコード]

私は少し前にこれを使ってフォルダー構造の深い(再帰的な)zip圧縮をしましたが、解凍したことは一度もありません。 やる気があれば、そのコードを取り出して、後でここに編集することもできます。


6


http://www.dotnetperls.com/gzipstream[GZipStream]は本当に使うのに便利なユーティリティです。


5


もう1つの良い選択肢は ドットネットZipです。


0


この方法でzipファイルを作成できます。

パブリック非同期タスクCreateZipFile(string sourceDirectoryPath、string name){var path = HostingEnvironment.MapPath(TempPath)name; Task.Run(()=> {if(File.Exists(path))File.Delete(path); ZipFile.CreateFromDirectory(sourceDirectoryPath、path);});を待ちます。復路; }

そして、あなたはこの方法でzipファイルを解凍することができます。1-この方法はzipファイルパスで動作します

public asyncタスクExtractZipFile(string filePath、string destinationDirectoryName){Task.Run(()=> {var archive = ZipFile.Open(filePath、ZipArchiveMode.Read); foreach(archive.Entriesのvarエントリ){entry.ExtractToFile() Path.Combine(destinationDirectoryName、entry.FullName)、true);} archive.Dispose();}); }

2-このメソッドはzipファイルストリームで動作します

public asyncタスクExtractZipFile(Stream zipFile、string destinationDirectoryName){string filePath = HostingEnvironment.MapPath(TempPath)Utility.GetRandomNumber(1、int.MaxValue); using(FileStream output = new FileStream(filePath、FileMode.Create)){zipFile.CopyToAsync(output)を待ってください。 Task.Run(()=> ZipFile.ExtractToDirectory(filePath、destinationDirectoryName))を待ってください。 Task.Run(()=> File.Delete(filePath))を待ちます。 }