2008-08-01 20 views

Odpowiedz

21

Zawsze korzystałem z biblioteki SharpZip.

Here's a link

+0

Uwaga: Znalazłem * int over flow * bug w kodzie SharpZip lata temu, który spowodował awarię plików losowych, które akurat miały odpowiednią kombinację wartości. Nie jestem pewien, czy to kiedykolwiek zostało naprawione, ale z pamięci zmieniłem zmienną 'int' na' long' w źródle SharpZip, aby uniknąć przepełnienia. * Będę musiał spróbować znaleźć mój stary poprawiony kod SharpZip i sprawdzić, czy pasuje do najnowszego *. –

6

Jest to bardzo proste do wykonania w Javie, i jak stwierdzono powyżej można dotrzeć do bibliotek java.util.zip z C#. O referencje patrz:

java.util.zip javadocs
sample code

Kiedyś to jakiś czas temu, aby zrobić głęboki (zip) rekurencyjnej struktury folderów, ale nie sądzę, bym kiedykolwiek użył rozpakowaniu. Jeśli jestem tak zmotywowany, mogę wyciągnąć ten kod i edytować go później.

24

Przestrzeń nazw schematu .Net 2.0 System.IO.Compression obsługuje algorytmy GZip i Deflate. Oto dwie metody kompresji i dekompresji strumienia bajtów, które można uzyskać z obiektu pliku. Możesz zastąpić GZipStream dla DefaultStream w poniższych metodach, aby użyć tego algorytmu. Pozostaje jednak problem obsługi plików skompresowanych za pomocą różnych algorytmów.

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

Moja odpowiedź będzie zamknąć oczy i zdecydować na DotNetZip. Zostało przetestowane przez dużą społeczność.

0

można utworzyć plik zip z tą metodą:

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; 
    } 

a następnie można rozpakować plik zip z tych metod: praca
1- tej metody ze ścieżką pliku 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 - ta metoda działa ze strumieniem pliku 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)); 
    } 
Powiązane problemy