2008-08-01 42 views

答えて

21

私はいつもSharpZipライブラリを使用してきました。トムが指摘したように

Here's a link

+0

注:* int overが見つかりました何年も前にSharpZipコードでflow *バグが発生したため、ちょうどそのような値の組み合わせがランダムに発生してしまった。それがこれまでに修正されているかどうかは確かではありませんが、メモリからSharpZipソース内の 'int'変数を' long'に変更してオーバーフローを避けました。 *私は古い固定シャープジップコードを見つけて、それが最新のものと一致するかチェックしなければならない*。 –

8

あなたは3rd-party library such as SharpZipを使用することができます。

別の方法(サードパーティ製以外)では、WindowsシェルAPIを使用することです。 C#プロジェクトでMicrosoftシェルコントロールとオートメーションCOMライブラリへの参照を設定する必要があります。ジェラルド・ギブソンがで例があります。

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

Internet Archive's copy of the dead page

6

これはJavaで行うことは非常に簡単です、と述べたように、あなたは、C#からjava.util.zipライブラリに達することができる上。参照を参照してください。

java.util.zip javadocs
sample code

私は、フォルダ構造の深い(再帰)ジップを行うにはしばらく前にこれを使用しますが、私は私が今まで解凍を使用しないと思います。私がそのような動機を持っているなら、そのコードを取り出して、後で編集することができます。

24

.Net 2.0フレームワークネームスペースSystem.IO.Compressionは、GZipおよびDeflateアルゴリズムをサポートしています。ファイルオブジェクトから取得できるバイトストリームを圧縮および解凍するには、次の2つの方法があります。以下の方法でDefaultStreamGZipStreamを代入して、そのアルゴリズムを使用することができます。しかし、これはまだ異なるアルゴリズムで圧縮されたファイルを扱うという問題を残す。

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(); 
} 
8

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

0

あなたがこの方法でzipファイルを作成することができます。

public async Task<string> CreateZipFile(string sourceDirectoryPath, string name) 
    { 
     var path = HostingEnvironment.MapPath(TempPath) + name; 
     await Task.Run(() => 
     { 
      if (File.Exists(path)) File.Delete(path); 
      ZipFile.CreateFromDirectory(sourceDirectoryPath, path); 
     }); 
     return path; 
    } 

、その後、あなたがこの方法でzipファイルを解凍することができます
1 - ZIPファイルのパス

public async Task ExtractZipFile(string filePath, string destinationDirectoryName) 
    { 
     await Task.Run(() => 
     { 
      var archive = ZipFile.Open(filePath, ZipArchiveMode.Read); 
      foreach (var entry in archive.Entries) 
      { 
       entry.ExtractToFile(Path.Combine(destinationDirectoryName, entry.FullName), true); 
      } 
      archive.Dispose(); 
     }); 
    } 

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

public async Task ExtractZipFile(Stream zipFile, string destinationDirectoryName) 
    { 
     string filePath = HostingEnvironment.MapPath(TempPath) + Utility.GetRandomNumber(1, int.MaxValue); 
     using (FileStream output = new FileStream(filePath, FileMode.Create)) 
     { 
      await zipFile.CopyToAsync(output); 
     } 
     await Task.Run(() => ZipFile.ExtractToDirectory(filePath, destinationDirectoryName)); 
     await Task.Run(() => File.Delete(filePath)); 
    } 
関連する問題